Работа со словарями json python

Формат данных JSON в Python

JSON (JavaScript Object Notation) это легковесный формат обмена данными. Людям его легко читать и вести в нем записи, а компьютеры запросто справляются с его синтаксическим анализом и генерацией.

JSON основан на языке программирования JavaScript. Но этот текстовый формат не зависит от языка и среди прочих может использоваться в Python и Perl. В основном его применяют для передачи данных между сервером и веб-приложением.

JSON построен на двух структурах:

  • Набор пар «имя-значение». Они могут быть реализованы как объект, запись, словарь, хеш-таблица, список «ключей-значений» или ассоциативный массив.
  • Упорядоченный список значений. Его реализуют в виде массива, вектора, списка или последовательности.

JSON в Python

В Python есть ряд пакетов, поддерживающих JSON, в частности metamagic.json, jyson, simplejson, Yajl-Py, ultrajson, и json. В этом руководстве мы будем использовать json, имеющий «родную» поддержку в Python. Для проверки данных JSON мы можем воспользоваться этим сайтом, предоставляющим JSON-линтер.

Ниже приведен пример записи JSON. Как видим, представление данных очень похоже на словари Python.

Конвертируем JSON в объекты Python

Вышеуказанную 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)

Конвертируем объекты Python в JSON

Используя json.dumps() , мы можем сконвертировать объекты Python в формат JSON.

blog = to_json= json.dumps(blog)

Теперь давайте сравним типы данных в Python и JSON.

Читайте также:  Html tab pages code
Python JSON
dict Object
list Array
tuple Array
str String
int Number
float Number
True true
False false
None null

Ниже мы покажем, как сконвертировать некоторые объекты Python в типы данных JSON.

Кортеж Python — в массив JSON

tuple_example = 'Mango', 'Banana', 'Apple' print(json.dumps(tuple_example))

Список Python — в массив JSON

list_example = ["Mango", 1, 3, 6, "Oranges"] print(json.dumps(list_example))

Строка Python — в строку JSON

string_example = "This is a cool example." print(json.dumps(string_example))

Булевы значения Python — в булевы значения JSON

boolean_value = False print(json.dumps(boolean_value))

Запись в файл JSON

Модуль 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. Для его загрузки вызовем json.load() .

with open('test_file.json', 'r') as j: json_data = json.load(j) print(json_data)

json.load vs json.loads

json.load используют для загрузки файла, а json.loads – для загрузки строки (loads расшифровывается как «load string»).

json.dump vs json.dumps

Аналогично, json.dump применяется, если нужно сохранить JSON в файл, а json.dumps (dump string) – если данные JSON нам нужны в виде строки для парсинга или вывода.

Работа с данными JSON в Data Science

Иногда при работе над проектами, связанными с 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)

Ограничения имплементации

Процесс кодирования в JSON называется сериализацией, а декодирования – десериализацией. Некоторые реализации десериализаторов имеют ограничения на:

  • размер принимаемых текстов JSON
  • максимальный уровень вложенности объектов и массивов JSON
  • диапазон точности чисел JSON
  • содержание и максимальную длину строк JSON.

Впрочем, подобные ограничения связаны только с типами данных Python и работой самого интерпретатора Python.

Формат JSON в разработке API

Одно из важнейших применений 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, > Эта программа отправит в браузер что-то вроде следующего:

Заключение

В этом уроке мы сделали небольшое введение в особенности работы с JSON в Python. Рассмотрели использование различных методов из модуля json, таких как json.load и json.dumps . Кроме того, мы разобрали, как загрузить данные в формате JSON для работы в проектах data science и как возвращать JSON при разработке API. Узнать больше о модуле json можно на его официальной странице на сайте Python.

Источник

Работа с файлами в формате JSON#

JSON (JavaScript Object Notation) — это текстовый формат для хранения и обмена данными.

JSON по синтаксису очень похож на Python и достаточно удобен для восприятия.

Как и в случае с CSV, в Python есть модуль, который позволяет легко записывать и читать данные в формате JSON.

Чтение#

 "access": [ "switchport mode access", "switchport access vlan", "switchport nonegotiate", "spanning-tree portfast", "spanning-tree bpduguard enable" ], "trunk": [ "switchport trunk encapsulation dot1q", "switchport mode trunk", "switchport trunk native vlan 999", "switchport trunk allowed vlan" ] > 

Для чтения в модуле json есть два метода:

  • json.load — метод считывает файл в формате JSON и возвращает объекты Python
  • json.loads — метод считывает строку в формате JSON и возвращает объекты Python

json.load #

Чтение файла в формате JSON в объект Python (файл json_read_load.py):

import json with open('sw_templates.json') as f: templates = json.load(f) print(templates) for section, commands in templates.items(): print(section) print('\n'.join(commands)) 
$ python json_read_load.py access switchport mode access switchport access vlan switchport nonegotiate spanning-tree portfast spanning-tree bpduguard enable trunk switchport trunk encapsulation dot1q switchport mode trunk switchport trunk native vlan 999 switchport trunk allowed vlan

json.loads #

Считывание строки в формате JSON в объект Python (файл json_read_loads.py):

import json with open('sw_templates.json') as f: file_content = f.read() templates = json.loads(file_content) print(templates) for section, commands in templates.items(): print(section) print('\n'.join(commands)) 

Результат будет аналогичен предыдущему выводу.

Запись#

Запись файла в формате JSON также осуществляется достаточно легко.

Для записи информации в формате JSON в модуле json также два метода:

  • json.dump — метод записывает объект Python в файл в формате JSON
  • json.dumps — метод возвращает строку в формате JSON

json.dumps #

Преобразование объекта в строку в формате JSON (json_write_dumps.py):

import json trunk_template = [ 'switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan' ] access_template = [ 'switchport mode access', 'switchport access vlan', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable' ] to_json = 'trunk': trunk_template, 'access': access_template> with open('sw_templates.json', 'w') as f: f.write(json.dumps(to_json)) with open('sw_templates.json') as f: print(f.read()) 

Метод json.dumps подходит для ситуаций, когда надо вернуть строку в формате JSON. Например, чтобы передать ее API.

json.dump #

Запись объекта Python в файл в формате JSON (файл json_write_dump.py):

import json trunk_template = [ 'switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan' ] access_template = [ 'switchport mode access', 'switchport access vlan', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable' ] to_json = 'trunk': trunk_template, 'access': access_template> with open('sw_templates.json', 'w') as f: json.dump(to_json, f) with open('sw_templates.json') as f: print(f.read()) 

Когда нужно записать информацию в формате JSON в файл, лучше использовать метод dump.

Дополнительные параметры методов записи#

Методам dump и dumps можно передавать дополнительные параметры для управления форматом вывода.

По умолчанию эти методы записывают информацию в компактном представлении. Как правило, когда данные используются другими программами, визуальное представление данных не важно. Если же данные в файле нужно будет считать человеку, такой формат не очень удобно воспринимать.

К счастью, модуль json позволяет управлять подобными вещами.

Передав дополнительные параметры методу dump (или методу dumps), можно получить более удобный для чтения вывод (файл json_write_indent.py):

import json trunk_template = [ 'switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan' ] access_template = [ 'switchport mode access', 'switchport access vlan', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable' ] to_json = 'trunk': trunk_template, 'access': access_template> with open('sw_templates.json', 'w') as f: json.dump(to_json, f, sort_keys=True, indent=2) with open('sw_templates.json') as f: print(f.read()) 

Теперь содержимое файла sw_templates.json выглядит так:

 "access": [ "switchport mode access", "switchport access vlan", "switchport nonegotiate", "spanning-tree portfast", "spanning-tree bpduguard enable" ], "trunk": [ "switchport trunk encapsulation dot1q", "switchport mode trunk", "switchport trunk native vlan 999", "switchport trunk allowed vlan" ] > 

Изменение типа данных#

Еще один важный аспект преобразования данных в формат 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)) 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:

Источник

Оцените статью