json¶
JSON (JavaScript Object Notation) — простой формат обмена данными, основанный на подмножестве синтаксиса JavaScript. Модуль json позволяет кодировать и декодировать данные в удобном формате.
Кодирование основных объектов Python:
>>> import json >>> json.dumps(['foo', 'bar': ('baz', None, 1.0, 2)>]) '["foo", ]' >>> print(json.dumps("\"foo\bar")) "\"foo\bar" >>> print(json.dumps('\u1234')) "\u1234" >>> print(json.dumps('\\')) "\\" >>> print(json.dumps("c": 0, "b": 0, "a": 0>, sort_keys=True)) "a": 0, "b": 0, "c": 0>
>>> import json >>> json.dumps([1,2,3,'4': 5, '6': 7>], separators=(',', ':')) '[1,2,3,]'
>>> import json >>> print(json.dumps('4': 5, '6': 7>, sort_keys=True, indent=4)) "4": 5, "6": 7 >
Декодирование (парсинг) JSON:
>>> import json >>> json.loads('["foo", <"bar":["baz", null, 1.0, 2]>]') ['foo', 'bar': ['baz', None, 1.0, 2]>] >>> json.loads('"\\"foo\\bar"') '"foo\x08ar'
Основы¶
json.dump()¶
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) — сериализует obj как форматированный JSON поток в fp .
Если skipkeys = True , то ключи словаря не базового типа ( str , unicode , int , long , float , bool , None ) будут проигнорированы, вместо того, чтобы вызывать исключение TypeError .
Если ensure_ascii = True , все не-ASCII символы в выводе будут экранированы последовательностями \uXXXX , и результатом будет строка, содержащая только ASCII символы. Если ensure_ascii = False , строки запишутся как есть.
Если check_circular = False , то проверка циклических ссылок будет пропущена, а такие ссылки будут вызывать OverflowError .
Если allow_nan = False , при попытке сериализовать значение с запятой, выходящее за допустимые пределы, будет вызываться ValueError ( nan , inf , -inf ) в строгом соответствии со спецификацией JSON, вместо того, чтобы использовать эквиваленты из JavaScript ( NaN , Infinity , -Infinity ).
Если indent является неотрицательным числом, то массивы и объекты в JSON будут выводиться с этим уровнем отступа. Если уровень отступа 0 , отрицательный или «» , то вместо этого будут просто использоваться новые строки. Значение по умолчанию None отражает наиболее компактное представление. Если indent — строка, то она и будет использоваться в качестве отступа.
Если sort_keys = True , то ключи выводимого словаря будут отсортированы.
json.dumps()¶
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) — сериализует obj в строку JSON-формата.
Аргументы имеют то же значение, что и для dump() .
Ключи в парах ключ/значение в JSON всегда являются строками. Когда словарь конвертируется в JSON, все ключи словаря преобразовываются в строки. В результате этого, если словарь сначала преобразовать в JSON, а потом обратно в словарь, то можно не получить словарь, идентичный исходному. Другими словами, loads(dumps(x)) != x , если x имеет нестроковые ключи.
json.load()¶
json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) — десериализует JSON из fp .
object_hook опциональная функция, которая применяется к результату декодирования объекта ( dict ). Использоваться будет значение, возвращаемое этой функцией, а не полученный словарь. object_pairs_hook опциональная функция, которая применяется к результату декодирования объекта с определённой последовательностью пар ключ/значение. Будет использован результат, возвращаемый функцией, вместо исходного словаря. Если задан так же object_hook , то приоритет отдаётся object_pairs_hook . parse_float если определён, будет вызван для каждого значения JSON с плавающей точкой. По умолчанию, это эквивалентно float(num_str) . parse_int если определён, будет вызван для строки JSON с числовым значением. По умолчанию эквивалентно int(num_str) . parse_constant если определён, будет вызван для следующих строк: -Infinity , Infinity , NaN . Может быть использовано для возбуждения исключений при обнаружении ошибочных чисел JSON.
Если не удастся десериализовать JSON, будет возбуждено исключение ValueError .
json.loads()¶
json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) — десериализует s (экземпляр str , содержащий документ JSON) в объект Python.
Остальные аргументы аналогичны аргументам в load() .
Кодировщики и декодировщики¶
json.JSONDecoder()¶
Класс json.JSONDecoder(object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None) — простой декодер JSON.
Выполняет следующие преобразования при декодировании:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number | (int) int |
number | (real) float |
true | True |
false | False |
null | None |
Он также понимает NaN , Infinity , и -Infinity как соответствующие значения float , которые находятся за пределами спецификации JSON.
json.JSONEncoder()¶
Класс json.JSONEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
Расширяемый кодировщик JSON для структур данных Python. Поддерживает следующие объекты и типы данных по умолчанию:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
Работа с json-файлами в Python
Статьи
Введение
JSON — это текстовый формат обмена данными, основанный на JavaScript. Но при этом формат независим от JS и может использоваться в любом языке программирования.
В данной статье научимся работать с json-файлами в языке программирования Python.
Модуль json
Для работы с json-файлами нам понадобится модуль json, который к счастью входит в стандартную библиотеку python. Импортируем его:
Создание json-файлов в Python
Создадим словарь data, и занесём в него данные к примеру человека по имени “Василий”:
Для создания json-файла используем конструкцию with … as. Назовём файл data1.json, и при момощи функции dump() преобразуем наш словарь в json-формат:
import json data = < "first_name": "Vasiliy", "email": "vasya@gmail.com", "salary": 25000.5, "age": 23, "human": True, "skills": ["To eat", "Play games", "Drinking beer"] >with open("data1.json", "w") as f: f.write(json.dumps(data, indent=4))
Параметр indent указывает на количество пробелов слева.
После запуска кода создастся json-файл под названием data1.json со следующим содержимым:
Обработка символов, отличных от ASCII
Теперь разберёмся, как работать с кодировками отличными от ASCII. К примеру заменим все слова на русские:
import json data = < "first_name": "Vasiliy", "email": "vasya@gmail.com", "salary": 25000.5, "age": 23, "human": True, "skills": ["Кушать", "Играть в игры", "Пить пиво"] >with open("data1.json", "w") as f: f.write(json.dumps(data, indent=4))
После запуска кода мы увидим, последовательности юникода, вместо русских букв:
Чтобы это исправить во-первых укажем кодировку при открытии файла, а в параметре ensure_ascii укажем False:
import json data = < "first_name": "Vasiliy", "email": "vasya@gmail.com", "salary": 25000.5, "age": 23, "human": True, "skills": ["Кушать", "Играть в игры", "Пить пиво"] >with open("data1.json", "w", encoding="utf-8") as f: f.write(json.dumps(data, indent=4, ensure_ascii=False))
После запуска кода получим json-файл со следующим содержимым:
Открыть json-файл в Python
Теперь научимся открывать json-файлы в самом Python.
Откроем файл в режиме для чтения используя конструкцию with … as, укажем кодировку UTF-8. Внутри конструкции в data загрузим данные из json-файла при момощи функции load() и выведем их:
import json with open("data1.json", 'r', encoding='UTF-8') as f: data = json.load(f) print(data) # Вывод:
Также можно использовать метод loads(), вместо load():
import json with open("data1.json", 'r', encoding='utf-8') as f: data = json.loads(f.read()) print(data) # Вывод:
Видеоурок
Заключение
В ходе статьи мы с Вами научились работать с json-файлами в Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂