JSON (JavaScript Object Notation) это легковесный формат обмена данными. Людям его легко читать и вести в нем записи, а компьютеры запросто справляются с его синтаксическим анализом и генерацией.
JSON основан на языке программирования JavaScript. Но этот текстовый формат не зависит от языка и среди прочих может использоваться в Python и Perl. В основном его применяют для передачи данных между сервером и веб-приложением.
JSON построен на двух структурах:
В Python есть ряд пакетов, поддерживающих JSON, в частности metamagic.json, jyson, simplejson, Yajl-Py, ultrajson, и json. В этом руководстве мы будем использовать json, имеющий «родную» поддержку в Python. Для проверки данных JSON мы можем воспользоваться этим сайтом, предоставляющим JSON-линтер.
Ниже приведен пример записи JSON. Как видим, представление данных очень похоже на словари Python.
{ "article": [ { "id": "01", "language": "JSON", "edition": "first", "author": "Derrick Mwiti" }, { "id": "02", "language": "Python", "edition": "second", "author": "Derrick Mwiti" } ], "blog": [ { "name": "Datacamp", "URL": "datacamp.com" } ] }
Вышеуказанную JSON-строку мы можем спарсить при помощи метода json.loads()
из модуля json
. В итоге получим словарь Python.
import json my_json_string = """{ "article": [ { "id":"01", "language": "JSON", "edition": "first", "author": "Derrick Mwiti" }, { "id":"02", "language": "Python", "edition": "second", "author": "Derrick Mwiti" } ], "blog":[ { "name": "Datacamp", "URL":"datacamp.com" } ] } """ to_python = json.loads(my_json_string)
to_python['blog']
[{'URL': 'datacamp.com', 'name': 'Datacamp'}]
Используя json.dumps()
, мы можем сконвертировать объекты Python в формат JSON.
blog = {'URL': 'datacamp.com', 'name': 'Datacamp'} to_json= json.dumps(blog)
to_json
'{"URL": "datacamp.com", "name": "Datacamp"}'
Теперь давайте сравним типы данных в Python и JSON.
Python | JSON |
dict | Object |
list | Array |
tuple | Array |
str | String |
int | Number |
float | Number |
True | true |
False | false |
None | null |
Ниже мы покажем, как сконвертировать некоторые объекты Python в типы данных JSON.
tuple_example = 'Mango', 'Banana', 'Apple' print(json.dumps(tuple_example))
["Mango", "Banana", "Apple"]
list_example = ["Mango", 1, 3, 6, "Oranges"] print(json.dumps(list_example))
["Mango", 1, 3, 6, "Oranges"]
string_example = "This is a cool example." print(json.dumps(string_example))
"This is a cool example."
boolean_value = False print(json.dumps(boolean_value))
false
Модуль json
позволяет также записывать данные JSON в файл. Такие файлы сохраняют с расширением .json
.
Давайте посмотрим, как это сделать. Для этого воспользуемся функцией open()
с параметром w
, сигнализирующим о том, что мы хотим записать в файл.
my_json_string = """{ "article": [ { "id":"01", "language": "JSON", "edition": "first", "author": "Derrick Mwiti" }, { "id":"02", "language": "Python", "edition": "second", "author": "Derrick Mwiti" } ], "blog":[ { "name": "Datacamp", "URL":"datacamp.com" } ] } """ with open('test_file.json', 'w') as file: json.dump(my_json_string, file)
Теперь продемонстрируем, как прочитать только что созданный нами файл JSON. Для его загрузки вызовем json.load()
.
with open('test_file.json', 'r') as j: json_data = json.load(j) print(json_data)
{ "article": [ { "id":"01", "language": "JSON", "edition": "first", "author": "Derrick Mwiti" }, { "id":"02", "language": "Python", "edition": "second", "author": "Derrick Mwiti" } ], "blog":[ { "name": "Datacamp", "URL":"datacamp.com" } ] }
json.load
используют для загрузки файла, а json.loads
– для загрузки строки (loads расшифровывается как «load string»).
Аналогично, json.dump
применяется, если нужно сохранить JSON в файл, а json.dumps
(dump string) – если данные JSON нам нужны в виде строки для парсинга или вывода.
Иногда при работе над проектами, связанными с data science, требуется загрузить данные в формате JSON. Библиотека для анализа данных Pandas предоставляет для этого функцию .read_json
. Как только данные загружены, мы конвертируем их в объект dataframe
при помощи атрибута pandas.DataFrame
.
import pandas as pd data = pd.read_json("https://api.github.com/users") df = pd.DataFrame(data)
df
Процесс кодирования в JSON называется сериализацией, а декодирования – десериализацией. Некоторые реализации десериализаторов имеют ограничения на:
Впрочем, подобные ограничения связаны только с типами данных Python и работой самого интерпретатора Python.
Одно из важнейших применений JSON – для разработки API в веб-приложениях. Этот формат очень полезен, ведь позволяет коллегам-разработчикам строить систему на основе наших API, используя любой язык, поддерживающий JSON. А такой поддержкой обладают практически все современные языки. На простом примере покажем, как вернуть JSON при разработке приложения на Python с фреймворком Flask. Flask предоставляет для этого модуль jsonify
.
from flask import jsonify @app.route('/_get_current_user') def get_current_user(): return jsonify(username=g.user.username, email=g.user.email, id=g.user.id)
Эта программа отправит в браузер что-то вроде следующего:
{ "username": "Derrick Mwiti", "email": "myemail@gmail.com", "id": 1 }
{'email': 'myemail@gmail.com', 'id': 1, 'username': 'Derrick Mwiti'}
В этом уроке мы сделали небольшое введение в особенности работы с JSON в Python. Рассмотрели использование различных методов из модуля json, таких как json.load
и json.dumps
. Кроме того, мы разобрали, как загрузить данные в формате JSON для работы в проектах data science и как возвращать JSON при разработке API. Узнать больше о модуле json можно на его официальной странице на сайте Python.
Управление памятью - важный, но часто упускаемый из виду аспект программирования. При неправильном подходе оно…
Как возникает круговой импорт? Эта ошибка импорта обычно возникает, когда два или более модуля, зависящих…
Вы когда-нибудь оказывались в ситуации, когда скрипт на Python выполняется очень долго и вы задаетесь…
В этом руководстве мы разберем все, что нужно знать о символах перехода на новую строку…
Блок if __name__ == "__main__" в Python позволяет определить код, который будет выполняться только при…
Давайте разберем, как настроить модульные тесты для экземпляров классов. Мы напишем тесты для проверки функциональности…