json_obj = json.load(json_file)# з файлаjson_obj = json.loads(json_str)# з рядкаwithopen('sw_templates.json', 'w')as json_file: json.dump(json_obj, json_file)# у файлjson_str = json.dumps(json_obj, separators=(',',':'))# у рядок
JSON (JavaScript Object Notation) – це текстовий формат для зберігання та обміну даними.
Когда нужно записать информацию в формате JSON в файл, лучше использовать метод dump.
Додаткові параметри методів запису
Методам dump и dumps можно передавать дополнительные параметры для управления форматом вывода.
По умолчанию эти методы записывают информацию в компактном представлении. Как правило, когда данные используются другими программами, визуальное представление данных не важно. Если же данные в файле нужно будет считать человеку, такой формат не очень удобно воспринимать.
К счастью, модуль json позволяет управлять подобными вещами.
Передав дополнительные параметры методу dump (или методу dumps), можно получить более удобный для чтения вывод (файл json_write_indent.py):
Еще один важный аспект преобразования данных в формат JSON: данные не всегда будут того же типа, что исходные данные в Python.
Например, кортежи при записи в JSON превращаются в списки:
In [1]: import json
In [2]: trunk_template = ('switchport trunk encapsulation dot1q',
...: 'switchport mode trunk',
...: 'switchport trunk native vlan 999',
...: 'switchport trunk allowed vlan')
In [3]: print(type(trunk_template))
<class 'tuple'>
In [4]: with open('trunk_template.json', 'w') as f:
...: json.dump(trunk_template, f, sort_keys=True, indent=2)
...:
In [5]: cat trunk_template.json
[
"switchport trunk encapsulation dot1q",
"switchport mode trunk",
"switchport trunk native vlan 999",
"switchport trunk allowed vlan"
]
In [6]: templates = json.load(open('trunk_template.json'))
In [7]: type(templates)
Out[7]: list
In [8]: print(templates)
['switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan']
Так происходит из-за того, что в JSON используются другие типы данных и не для всех типов данных Python есть соответствия.
Таблица конвертации данных Python в JSON:
Python
JSON
dict
object
list, tuple
array
str
string
int, float
number
True
true
False
false
None
null
Таблица конвертации JSON в данные Python:
JSON
Python
object
dict
array
list
string
str
number (int)
int
number (real)
float
true
True
false
False
null
None
Ограничение по типам данных
В формат JSON нельзя записать словарь, у которого ключи - кортежи:
In [23]: to_json = {('trunk', 'cisco'): trunk_template, 'access': access_template}
In [24]: with open('sw_templates.json', 'w') as f:
...: json.dump(to_json, f)
...:
...
TypeError: key ('trunk', 'cisco') is not a string
С помощью дополнительного параметра можно игнорировать подобные ключи:
In [25]: to_json = {('trunk', 'cisco'): trunk_template, 'access': access_template}
In [26]: with open('sw_templates.json', 'w') as f:
...: json.dump(to_json, f, skipkeys=True)
...:
...:
In [27]: cat sw_templates.json
{"access": ["switchport mode access", "switchport access vlan", "switchport nonegotiate", "spanning-tree portfast", "spanning-tree bpduguard enable"]}
Кроме того, в JSON ключами словаря могут быть только строки. Но, если в словаре Python использовались числа, ошибки не будет. Вместо этого выполнится конвертация чисел в строки:
In [28]: d = {1: 100, 2: 200}
In [29]: json.dumps(d)
Out[29]: '{"1": 100, "2": 200}'