Json python load: 18.2. json — JSON encoder and decoder — Python 2.7.18 documentation
Модуль json в Python. | DOCS-Python.ru
Чтение и парсинг json формата, запись данных в файл.
JavaScript Object Notation (JSON) — это независимый от языка формат обмена данными, представленный в текстовом виде и понятный человеку. Он был получен из стандарта языка программирования ECMAScript. Формат JSON
определяет маленький набор правил форматирования для переносимого представления структурированных данных.
Информация в формате JSON может быть представлена в двух видах:
- Последовательность пар с ключами и соответствующими им значениями, подобно словарям;
- Просто упорядоченный набор значений, подобно спискам.
Модуль json
предоставляет API, подобный стандартным библиотечным модулям piclike
.
Примечания:
- JSON — это подмножество YAML 1.2. Объект JSON, создаваемый с значением разделителей по умолчанию, также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль также можно использовать в качестве сериализатора YAML.
- Сериализатор и десериализатор этого модуля по умолчанию сохраняют порядок ввода и вывода элементов. Порядок теряется только в том случае, если вложенные контейнеры неупорядочены.
Стандартное соответствие и совместимость:
Этот модуль НЕ строго соответствует RFC, реализуя некоторые расширения, которые являются допустимым JavaScript, но не допустимым JSON.
- Бесконечные и
NaN
числовые значения принимаются и выводятся; - Повторные имена внутри объекта принимаются и используется только значение последней пары
name:value
.
Поскольку RFC позволяет RFC-совместимым синтаксическим анализаторам принимать входные тексты, не соответствующие RFC, десериализатор этого модуля технически RFC-совместим при настройках по умолчанию.
Бесконечные числовые значения и NaN
:
RFC не допускает представление бесконечных или числовых значений NaN
. Несмотря на это, по умолчанию этот модуль принимает и выводит Infinity
, -Infinity
и NaN
, как если бы они были действительными значениями литералов числа JSON:
# Ни один из этих вызовов не вызывает исключение, # но результаты не являются допустимыми JSON >>> import json >>> json.dumps(float('-inf')) # '-Infinity' >>> json.dumps(float('nan')) # 'NaN' >>> # Same when deserializing >>> json.loads('-Infinity') # -inf >>> json.loads('NaN') # nan
- В сериализаторе параметр
allow_nan
может использоваться для изменения этого поведения. - В десериализаторе параметр
parse_constant
может использоваться для изменения этого поведения.
Повторяющиеся имена внутри объекта:
RFC указывает, что имена в объекте JSON должны быть уникальными и не повторятся, но не предписывает, как они должны обрабатываться в объектах JSON. По умолчанию этот модуль json
не вызывает исключение, вместо этого он игнорирует все, кроме последней пары имя-значение для данного имени:
>>> import json >>> weird_json = '{"x": 1, "x": 2, "x": 3}' >>> json.loads(weird_json) {'x': 3}
Параметр object_pairs_hook
можно использовать для изменения этого поведения.
Кодировки символов:
RFC требует, чтобы JSON был представлен с использованием UTF-8, UTF-16 или UTF-32, при этом UTF-8 является рекомендуемым значением по умолчанию для максимальной совместимости.
В соответствии с разрешением, хотя и не обязательным для RFC, сериализатор этого модуля по умолчанию задает значение sure_ascii=True
, таким образом экранируя выходные данные, поэтому результирующие строки содержат только символы ASCII.
Помимо параметра sure_ascii
, этот модуль определен строго с точки зрения преобразования между объектами Python и строками Unicode, в противном случае напрямую не решает проблему кодировки символов.
RFC запрещает добавлять метку порядка байтов (BOM) в начало текста JSON, сериализатор этого модуля не добавляет BOM в свой вывод. RFC разрешает, но не требует от десериализаторов JSON игнорировать начальную спецификацию в своих входных данных. Десериализатор модуля json
вызывает ошибку ValueError
, когда присутствует начальная спецификация.
RFC явно не запрещает строки JSON, которые содержат последовательности байтов, которые не соответствуют действительным символам Unicode, например непарные суррогаты UTF-16, но отмечает, что они могут вызывать проблемы взаимодействия. По умолчанию этот модуль принимает и выводит, если присутствует в исходной строке, кодовые точки для таких последовательностей.
Как работать с данными JSON с помощью Python
В этом руководстве показано, как легко использовать язык программирования Python для работы с данными JSON.
Прежде чем я начну тему, давайте кратко определим, что мы подразумеваем под JSON . Давайте посмотрим, как это определяет главный сайт JSON:
JSON (JavaScript Object Notation) — это легкий формат обмена данными. Людям легко читать и писать. Машины легко разбираются и генерируются. Он основан на подмножестве языка программирования JavaScript , стандарт ECMA-262, 3-е издание, декабрь 1999 года . JSON — это текстовый формат, полностью независимый от языка, но использующий соглашения, знакомые программистам языков семейства C, включая C, C ++, C #, Java, JavaScript, Perl, Python и многие другие. Эти свойства делают JSON идеальным языком обмена данными.
Таким образом, JSON — это простой способ создания и хранения структур данных в JavaScript. Причина, по которой вы видите JavaScript в аббревиатуре, связана с тем, что при хранении данных в JSON создается объект JavaScript. Но, не волнуйтесь, вам не нужно знать JavaScript для работы с файлами JSON, скорее речь идет о самом синтаксисе (формате) JSON.
Вкратце, JSON — это способ, которым мы храним и обмениваемся данными, что достигается с помощью его синтаксиса и используется во многих веб-приложениях. Хорошая особенность JSON заключается в том, что он имеет удобочитаемый формат, и это может быть одной из причин его использования при передаче данных в дополнение к его эффективности при работе с API .
Пример данных в формате JSON:
1 2 | {«name»: «Frank», «age»: 39, «isEmployed»: true} |
В этом уроке я покажу вам, как использовать Python для работы с файлами JSON. Итак, начнем!
Python и JSON
Python упрощает работу с файлами JSON. Модуль, используемый для этой цели, является модулем json
. Этот модуль должен быть включен (встроен) в вашу установку Python, поэтому вам не нужно устанавливать какие-либо внешние модули, как, например, мы работали с файлами PDF и Excel . Единственное, что вам нужно для использования этого модуля, это импортировать его:
import json
Но что делает библиотека json
? Эта библиотека в основном анализирует JSON из файлов или строк. Он также анализирует JSON в словарь или список в Python и наоборот, то есть преобразует словарь или список Python в строки JSON.
JSON в Python
Чтение JSON означает преобразование JSON в значение (объект) Python. Как упоминалось выше, библиотека json
анализирует JSON в словарь или список в Python. Для этого мы используем функцию load loads()
(загрузка из строки) следующим образом:
1 2 3 | import json jsonData = ‘{«name»: «Frank», «age»: 39}’ jsonToPython = json.loads(jsonData) |
Если вы хотите увидеть вывод, выполните print jsonToPython
, и в этом случае вы получите следующий вывод:
{u'age': 39, u'name': u'Frank'}
То есть данные возвращаются как словарь Python (структура данных объекта JSON). Итак, будет ли оператор print jsonToPython['name']
возвращать какой-либо вывод? Давай, попробуй.
Python в JSON
В предыдущем разделе мы увидели, как преобразовать JSON в значение Python (т.е. словарь). В этом разделе я покажу вам, как мы можем преобразовать (кодировать) значение Python в JSON.
Скажем, у нас есть следующий словарь в Python:
1 2 3 | import json pythonDictionary = {‘name’:’Bob’, ‘age’:44, ‘isEmployed’:True} dictionaryToJson = json.dumps(pythonDictionary) |
Если мы print dictionaryToJson
, мы получим следующие данные JSON:
{"age": 44, "isEmployed": true, "name": "Bob"}
Таким образом, этот вывод считается представлением данных объекта (словарь). Метод dumps()
был ключом к такой операции.
На этом этапе важно отметить, что JSON не может хранить все типы объектов Python, а только следующие типы: Lists; Словари; Булевы; Числа; Символьные строки; и нет. Таким образом, любые другие типы должны быть преобразованы для хранения в JSON.
Допустим, у нас есть следующий класс :
1 2 3 | class Employee(object): def __init__(self, name): self.name = name |
Допустим, мы создали новый объект abder
следующим образом:
abder = Employee('Abder')
Что если мы хотим преобразовать этот объект в JSON? Это json.dumps(abder)
? В этом случае вы получите ошибку, подобную следующей:
01 02 03 04 05 06 07 08 09 10 11 12 | Traceback (most recent call last): File «test.py», line 8, in <module> abderJson = json.dumps(abder) File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py», line 243, in dumps return _default_encoder.encode(obj) File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py», line 207, in encode chunks = self.iterencode(o, _one_shot=True) File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py», line 270, in iterencode return _iterencode(o, 0) File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py», line 184, in default raise TypeError(repr(o) + » is not JSON serializable») TypeError: <__main__.Employee object at 0x10e74b750> is not JSON serializable |
Но есть ли обходной путь? К счастью, есть. Мне нравится обходной путь, описанный на сайте Python Tips . Чтобы решить эту проблему, мы можем определить метод, подобный следующему:
1 2 | def jsonDefault(object): return object.__dict__ |
Затем закодируйте объект в JSON следующим образом:
jsonAbder = json.dumps(abder, default=jsonDefault)
Если вы print jsonAbder
, вы должны получить следующий вывод:
{"name": "Abder"}
Теперь мы закодировали объект Python ( abder
) в JSON.
Вывод
Из этого урока мы можем заметить, что Python снова и снова доказывает не только свою способность работать с различными приложениями, но также и его гибкость для работы с различными проблемами при работе с приложением, как мы видели в последней части урока.
Если вы хотите узнать больше о модуле json
, вы можете посетить страницу документации .
Изучите JavaScript: полное руководство
Мы создали полное руководство, которое поможет вам изучить JavaScript , независимо от того, начинаете ли вы как веб-разработчик или хотите изучать более сложные темы.
Выучить питон
Изучите Python с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.
54) Python JSON — CoderLessons.com
Что такое JSON?
JSON — это стандартный формат для обмена данными, основанный на JavaScript. Как правило, JSON находится в строковом или текстовом формате. JSON обозначает J AVA S cript O ▪ Таблица N otation.
Синтаксис JSON: JSON записывается как пара ключ-значение.
{ "Key": "Value", "Key": "Value", }
JSON очень похож на словарь Python. Python поддерживает JSON и имеет встроенную библиотеку в виде JSON.
Библиотека JSON на Python
Внешние модули Python ‘ marshal ‘ и ‘ pickle’ поддерживают версию библиотеки JSON . Для выполнения операций, связанных с JSON, таких как кодирование и декодирование в Python, сначала необходимо импортировать библиотеку JSON, а для этого — в свой файл .py ,
import json
Следующие методы доступны в модуле JSON
метод | Описание |
---|---|
свалки () | кодирование в объекты JSON |
дамп () | запись кодированной строки в файл |
нагрузки () | Декодировать строку JSON |
нагрузка () | Декодировать при чтении файла JSON |
Python в JSON (кодировка)
JSON Library of Python по умолчанию выполняет следующий перевод объектов Python в объекты JSON
питон | JSON |
ДИКТ | объект |
список | массив |
юникода | строка |
число — int, long | число — int |
поплавок | число — реальное |
Правда | Правда |
Ложь | Ложь |
Никто | Значение NULL |
Преобразование данных Python в JSON называется операцией кодирования. Кодирование выполняется с помощью метода библиотеки JSON — dumps ().
Метод dumps () преобразует объект словаря python в формат строковых данных JSON.
Теперь давайте выполним наш первый пример кодирования на Python.
import json x = { "name": "Ken", "age": 45, "married": True, "children": ("Alice","Bob"), "pets": ['Dog'], "cars": [ {"model": "Audi A1", "mpg": 15.1}, {"model": "Zeep Compass", "mpg": 18.1} ] } # sorting result in asscending order by keys: sorted_string = json.dumps(x, indent=4, sort_keys=True) print(sorted_string)
Вывод:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Давайте создадим JSON-файл словаря, используя ту же функцию dump ()
# here we create new data_file.json file with write mode using file i/o operation with open('json_file.json', "w") as file_write: # write json data into file json.dump(person_data, file_write)
Вывод:
Нечего показать … В вашей системе создан файл json_file.json, вы можете проверить этот файл.
JSON в Python (декодирование)
JSON строка декодирования выполняется с помощью встроенных методов нагрузок () и нагрузки () библиотеки JSON в Python. Здесь таблица перевода показывает пример объектов JSON в объекты Python, которые полезны для выполнения декодирования в Python строки JSON.
JSON | питон |
объект | ДИКТ |
массив | список |
строка | юникода |
число — int | число — int, long |
число — реальное | поплавок |
Правда | Правда |
Ложь | Ложь |
Значение NULL | Никто |
Давайте рассмотрим базовый пример декодирования в Python с помощью функции json.loads () ,
import json # json library imported # json data string person_data = '{ "person": { "name": "Kenn", "sex": "male", "age": 28}}' # Decoding or converting JSON format in dictionary using loads() dict_obj = json.loads(person_data) print(dict_obj) # check type of dict_obj print("Type of dict_obj", type(dict_obj)) # get human object details print("Person......", dict_obj.get('person'))
Вывод:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}} Type of dict_obj <class 'dict'> Person...... {'name': 'John', 'sex': 'male'}
Расшифровка файла JSON или анализ файла JSON в Python
ПРИМЕЧАНИЕ. Декодирование файла JSON является операцией, связанной с вводом / выводом файла (I / O). Файл JSON должен существовать в вашей системе в указанном месте, которое вы упоминаете в своей программе.
Пример,
import json #File I/O Open function for read data from JSON File with open('X:/json_file.json') as file_object: # store file data in object data = json.load(file_object) print(data)
Здесь данные — это словарь объекта Python.
Вывод:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Компактное кодирование в Python
Когда вам нужно уменьшить размер файла JSON, вы можете использовать компактную кодировку в Python.
Пример,
import json # Create a List that contains dictionary lst = ['a', 'b', 'c',{'4': 5, '6': 7}] # separator used for compact representation of JSON. # Use of ',' to identify list items # Use of ':' to identify key and value in dictionary compact_obj = json.dumps(lst, separators=(',', ':')) print(compact_obj)
Вывод:
'["a", "b", "c", {"4": 5, "6": 7}]' ** Here output of JSON is represented in a single line which is the most compact representation by removing the space character from compact_obj **
Формат JSON-кода (красивая печать)
- Цель состоит в том, чтобы написать хорошо отформатированный код для понимания человеком. С помощью красивой печати любой может легко понять код.
- Пример,
import json dic = { 'a': 4, 'b': 5 } ''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. ''' formatted_obj = json.dumps(dic, indent=4, separators=(',', ': ')) print(formatted_obj)
Вывод:
{ "a" : 4, "b" : 5 }
Чтобы лучше понять это, измените отступ на 40 и просмотрите результат:
Заказ кода JSON:
Атрибут sort_keys в аргументе функции dumps () отсортирует ключ в JSON в порядке возрастания. Аргумент sort_keys является логическим атрибутом. Если это правда, сортировка разрешена, иначе нет
Пример,
import json x = { "name": "Ken", "age": 45, "married": True, "children": ("Alice", "Bob"), "pets": [ 'Dog' ], "cars": [ {"model": "Audi A1", "mpg": 15.1}, {"model": "Zeep Compass", "mpg": 18.1} ], } # sorting result in asscending order by keys: sorted_string = json.dumps(x, indent=4, sort_keys=True) print(sorted_string)
Output:
{ "age": 45, "cars": [ { "model": "Audi A1", "mpg": 15.1 }, { "model": "Zeep Compass", "mpg": 18.1 } ], "children": [ "Alice", "Bob" ], "married": true, "name": "Ken", "pets": [ "Dog" ] }
As you may observe the keys age, cars, children, etc are arranged in ascending order.
Сложное объектное кодирование Python
Сложный объект состоит из двух разных частей, которые
- Реальная часть
- Мнимая часть
Пример: 3 + 2i
Перед выполнением кодирования сложного объекта необходимо проверить, является ли переменная сложной или нет. Вам необходимо создать функцию, которая проверяет значение, хранящееся в переменной, используя метод экземпляра.
Давайте создадим специальную функцию для проверки, объект сложен или пригоден для кодирования.
import json # create function to check instance is complex or not def complex_encode(object): # check using isinstance method if isinstance(object, complex): return [object.real, object.imag] # raised error using exception handling if object is not complex raise TypeError(repr(object) + " is not JSON serialized") # perform json encoding by passing parameter complex_obj = json.dumps(4 + 5j, default=complex_encode) print(complex_obj)
Вывод:
'[4.0, 5.0]'
Декодирование сложных JSON-объектов в Python
Чтобы декодировать сложный объект в JSON, используйте параметр object_hook, который проверяет, содержит ли строка JSON сложный объект или нет. Пример,
import json # function check JSON string contains complex object def is_complex(objct): if '__complex__' in objct: return complex(objct['real'], objct['img']) return objct # use of json loads method with object_hook for check object complex or not complex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex) #here we not passed complex object so it's convert into dictionary simple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex) print("Complex_object......",complex_object) print("Without_complex_object......",simple_object)
Вывод:
Complex_object...... (4+5j) Without_complex_object...... {'real': 6, 'img': 7}
Обзор класса сериализации JSON JSONEncoder
Класс JSONEncoder используется для сериализации любого объекта Python при выполнении кодирования. Он содержит три различных метода кодирования, которые
- default (o) — реализовано в подклассе и возвращает сериализованный объект для объекта o .
- encode (o) — так же, как метод json.dumps (), возвращает строку JSON структуры данных Python.
- iterencode (o) — представляет строку одну за другой и кодирует объект o.
С помощью метода encode () класса JSONEncoder мы также можем кодировать любой объект Python.
# import JSONEncoder class from json from json.encoder import JSONEncoder colour_dict = { "colour": ["red", "yellow", "green" ]} # directly called encode method of JSON JSONEncoder().encode(colour_dict)
Вывод:
'{"colour": ["red", "yellow", "green"]}'
Обзор класса десериализации JSON JSONDecoder
Класс JSONDecoder используется для десериализации любого объекта Python при выполнении декодирования. Он содержит три различных метода декодирования, которые
- default (o) — реализовано в подклассе и возвращает десериализованный объект o объект.
- decode (o) — То же, что и метод json.loads (), возвращает структуру данных Python из строки или данных JSON.
- raw_decode (o) — представляет словарь Python один за другим и декодирует объект o.
С помощью метода decode () класса JSONDecoder мы также можем декодировать строку JSON.
import json # import JSONDecoder class from json from json.decoder import JSONDecoder colour_string = '{ "colour": ["red", "yellow"]}' # directly called decode method of JSON JSONDecoder().decode(colour_string)
Вывод:
{'colour': ['red', 'yellow']}
Декодирование данных JSON из URL: пример из реальной жизни
Мы получим данные CityBike NYC (Bike Sharing System) с указанного URL-адреса ( https://feeds.citibikenyc.com/stations/stations.json ) и преобразуем в словарный формат.
Пример,
ПРИМЕЧАНИЕ: — Убедитесь, что библиотека запросов уже установлена в вашем Python. Если нет, откройте терминал или CMD и введите
- (Для Python 3 или выше) pip3 устанавливает запросы
import json import requests # get JSON string data from CityBike NYC using web requests library json_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json") # check type of json_response object print(type(json_response.text)) # load data in loads() function of json library bike_dict = json.loads(json_response.text) #check type of news_dict print(type(bike_dict)) # now get stationBeanList key data from dict print(bike_dict['stationBeanList'][0])
Вывод:
<class 'str'> <class 'dict'> { 'id': 487, 'stationName': 'E 20 St & FDR Drive', 'availableDocks': 24, 'totalDocks': 34, 'latitude': 40.73314259, 'longitude': -73.97573881, 'statusValue': 'In Service', 'statusKey': 1, 'availableBikes': 9, 'stAddress1': 'E 20 St & FDR Drive', 'stAddress2': '', 'city': '', 'postalCode': '', 'location': '', 'altitude': '', 'testStation': False, 'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': '' }
Исключения, связанные с библиотекой JSON в Python:
- Класс json.JSONDecoderError обрабатывает исключение, связанное с операцией декодирования. и это подкласс ValueError.
- Исключение — json.JSONDecoderError (msg, doc)
- Параметры Исключения есть,
- msg — неформатированное сообщение об ошибке
- doc — документы JSON проанализированы
- pos — начать индекс документа, когда это не удалось
- белье — линия не показывает соответствует поз
- двоеточие — столбец не соответствует поз
Пример,
import json #File I/O Open function for read data from JSON File data = {} #Define Empty Dictionary Object try: with open('json_file_name.json') as file_object: data = json.load(file_object) except ValueError: print("Bad JSON file format, Change JSON File")
Бесконечные и NaN числа в Python
Формат обмена данными JSON (RFC — Запрос комментариев) не допускает бесконечное значение или значение Nan, но в библиотеке Python-JSON нет ограничений на выполнение операций, связанных с бесконечным значением и значением Nan. Если JSON получает INFINITE и тип данных Nan, он преобразует его в литерал.
Пример,
import json # pass float Infinite value infinite_json = json.dumps(float('inf')) # check infinite json type print(infinite_json) print(type(infinite_json)) json_nan = json.dumps(float('nan')) print(json_nan) # pass json_string as Infinity infinite = json.loads('Infinity') print(infinite) # check type of Infinity print(type(infinite))
Вывод:
Infinity <class 'str'> NaN inf <class 'float'>
Повторный ключ в строке JSON
RFC указывает, что имя ключа должно быть уникальным в объекте JSON, но это не обязательно. Библиотека JSON Python не вызывает исключение повторяющихся объектов в JSON. Он игнорирует все повторяющиеся пары ключ-значение и рассматривает только последнюю пару ключ-значение среди них.
import json repeat_pair = '{"a": 1, "a": 2, "a": 3}' json.loads(repeat_pair)
Вывод:
{'a': 3}
CLI (интерфейс командной строки) с JSON в Python
json.tool предоставляет интерфейс командной строки для проверки синтаксиса JSON pretty-print. Давайте посмотрим на пример CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Вывод:
{ "name": " Kings Authur " }
Преимущества JSON в Python
- Легко перемещаться назад между контейнером и значением (JSON в Python и Python в JSON)
- Удобный для чтения (Pretty-print) объект JSON
- Широко используется в обработке данных.
- Не имеет одинаковую структуру данных в одном файле.
Ограничение реализации JSON в Python
- В десериализаторе диапазона JSON и предсказании числа
- Максимальная длина строки JSON и массивов JSON и уровней вложенности объекта.
Чит код
json.dumps (person_data) | Создать объект JSON |
json.dump (person_data, file_write) | Создайте файл JSON с помощью файлового ввода-вывода Python |
compact_obj = json.dumps (data, separators = (‘,’, ‘:’)) | Сжатие объекта JSON путем удаления символа пробела из объекта JSON с использованием разделителя |
formatted_obj = json.dumps (dic, indent = 4, separators = (‘,’, ‘:’)) | Форматирование кода JSON с использованием отступа |
sorted_string = json.dumps (x, отступ = 4, sort_keys = True) | Сортировка ключа объекта JSON по алфавиту |
complex_obj = json.dumps (4 + 5j, по умолчанию = complex_encode) | Кодирование сложных объектов Python в JSON |
JSONEncoder (). Закодировать (colour_dict) | Использование класса JSONEncoder для сериализации |
json.loads (data_string) | Расшифровка строки JSON в словаре Python с помощью функции json.loads () |
json.loads (‘{«__ complex__»: true, «real»: 4, «img»: 5}’, object_hook = is_complex) | Декодирование сложного объекта JSON в Python |
JSONDecoder (). Декодирование (colour_string) | Использование декодирования JSON в Python с десериализацией |
Как распарсить строку json в Python
Людям, работающим с веб часто приходится сталкиваться с необходимостью взаимодействовать с объектами JSON (JavaScript Object Notation). Это удобный способ структурированно хранить необходимые данные. Понятное дело, что и на Python должна быть реализация взаимодействия со строками JSON.
Разработчики Python позаботились об этом, поэтому в состав стандартной библиотеки Python входит модуль json. Почитать подробнее о нем можно в официальной документации, а пока мы сконцентрируемся на конкретной задаче:
Распарсить строку json средствами Python.
Представим, что у нас есть следующая строка json, представляющая заказ товара в интернет-магазине:
{ "orderID": 42, "customerName": "John Smith", "customerPhoneN": "555-1234", "orderContents": [ { "productID": 23, "productName": "keyboard", "quantity": 1 }, { "productID": 13, "productName": "mouse", "quantity": 1 } ], "orderCompleted": true }
Тогда код на Python должен быть следующим:
import json # строка которую будем парсить json_string = """ { "orderID": 42, "customerName": "John Smith", "customerPhoneN": "555-1234", "orderContents": [ { "productID": 23, "productName": "keyboard", "quantity": 1 }, { "productID": 13, "productName": "mouse", "quantity": 1 } ], "orderCompleted": true } """ # распарсенная строка parsed_string = json.loads(json_string)
Переменная parsed_string будет иметь тип данных словарь, следовательно любой элемент строки json можно будет получить через необходимый ключ:
Как видите, для того чтобы распарсить строку json средствами Python достаточно воспользоваться встроенной библиотекой этого прекрасного языка программирования.
Примеры использования JSONPath в Python
Перевод статьи Python JSONPath Examples.
Что такое JSONPath?
JSONPath это язык запросов к JSON. Он очень похож на язык запросов XPath для XML. Вы формируете строку запроса и получаете нужное значение. Такое подход экономит память, так как необходимости разбазарить JSON полностью.
Библиотеки Python для JSONPath
Существует много JSONPath-библиотек для Python.
jsonpath: это портированая из Perl и JavaScript версия JSONPath.
jsonpath-rw: полностью Python-реализация JSONPath. Объект выражения JSONPath это объект первого класса, простой для анализа, преобразования, обработки, печати и расширения. Модуль jsonpath-rw-ext расширяет функционал библиотеки.
jsonpath-ng: окончательная реализация JSONPath цель которой соответствие стандарту, включая арифметические и бинарные сравнения. Эта библиотека соединяет модули jsonpath-rw
и jsonpath-rw-ext
и расширяет их.
Какую библиотеку использовать?
Модуль jsonpath-ng
самый развитый и написан на чистом Python. Он поддерживает Python 2 и Python 3. Мы будем использовать этот модуль для примеров.
Установка модуля:
pip3.7 install jsonpath-ng
| pip3.7 install jsonpath-ng |
Разбор JSON
Рассмотрим пример разбора JSON и получения значения требуемого атрибута.
import json
from jsonpath_ng import jsonpath, parse
json_string = ‘{«id»:1, «name»:»Pankaj»}’
json_data = json.loads(json_string)
jsonpath_expression = parse(‘$.id’)
match = jsonpath_expression.find(json_data)
print(match)
print(«id value is», match[0].value)
| import json
from jsonpath_ng import jsonpath, parse
json_string = ‘{«id»:1, «name»:»Pankaj»}’ json_data = json.loads(json_string)
jsonpath_expression = parse(‘$.id’)
match = jsonpath_expression.find(json_data)
print(match) print(«id value is», match[0].value) |
Вывод программы:
[DatumInContext(value=1, path=Fields(‘id’), context=DatumInContext(value={‘id’: 1, ‘name’: ‘Pankaj’}, path=Root(), context=None))]
id value is 1
| [DatumInContext(value=1, path=Fields(‘id’), context=DatumInContext(value={‘id’: 1, ‘name’: ‘Pankaj’}, path=Root(), context=None))] id value is 1 |
Мы используем модуль json
для преобразования строки JSON в словарь.
Расписка списка
Ключи JSON могут содержать списки значений. Мы можем использовать JSONPath для анализа списоков и получения значений.
Предположим, что у нас есть JSON-файл db.json
с следующим содержимым:
{
«employees»: [
{
«id»: 1,
«name»: «Pankaj»,
«salary»: «10000»
},
{
«name»: «David»,
«salary»: «5000»,
«id»: 2
}
]
}
| { «employees»: [ { «id»: 1, «name»: «Pankaj», «salary»: «10000» }, { «name»: «David», «salary»: «5000», «id»: 2 } ] } |
Мы хотим разобрать этот JSON-файл и получить список идентификаторов сотрудников.
import json
from jsonpath_ng import jsonpath, parse
with open(«db.json», ‘r’) as json_file:
json_data = json.load(json_file)
print(json_data)
jsonpath_expression = parse(’employees[*].id’)
for match in jsonpath_expression.find(json_data):
print(f’Employee id: {match.value}’)
| import json from jsonpath_ng import jsonpath, parse
with open(«db.json», ‘r’) as json_file: json_data = json.load(json_file)
print(json_data)
jsonpath_expression = parse(’employees[*].id’)
for match in jsonpath_expression.find(json_data): print(f’Employee id: {match.value}’) |
Вывод программы:
{’employees’: [{‘id’: 1, ‘name’: ‘Pankaj’, ‘salary’: ‘10000’}, {‘name’: ‘David’, ‘salary’: ‘5000’, ‘id’: 2}]}
Employee id: 1
Employee id: 2
| {’employees’: [{‘id’: 1, ‘name’: ‘Pankaj’, ‘salary’: ‘10000’}, {‘name’: ‘David’, ‘salary’: ‘5000’, ‘id’: 2}]} Employee id: 1 Employee id: 2 |
Рекомендовано к чтению
Python доступ к вложенным данным JSON
Я пытаюсь получить почтовый индекс для конкретного города с помощью zippopotam.нас. У меня есть следующий код, который работает, за исключением случаев, когда я пытаюсь получить доступ к post code
ключ, который возвращает TypeError: expected string or buffer
r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()
data = json.loads(j)
print j['state']
print data['places']['latitude']
полный выход JSON:
{
"country abbreviation": "US",
"places": [
{
"place name": "Belmont",
"longitude": "-71.4594",
"post code": "02178",
"latitude": "42.4464"
},
{
"place name": "Belmont",
"longitude": "-71.2044",
"post code": "02478",
"latitude": "42.4128"
}
],
"country": "United States",
"place name": "Belmont",
"state": "Massachusetts",
"state abbreviation": "MA"
}
Спасибо за вашу помощь.
4 ответов
Places-это список, а не словарь. Поэтому эта строка ниже не должна работать:
print data['places']['latitude']
вам нужно выбрать один из элементов в местах, а затем вы можете перечислить свойства места. Поэтому, чтобы получить первый почтовый код, вы должны сделать:
print data['places'][0]['post code']
Я не понял, что первый вложенный элемент на самом деле массив. Правильный способ доступа к ключу post code выглядит следующим образом:
r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()
print j['state']
print j['places'][1]['post code']
в вашем коде j — это уже данные json, а j [‘places’] — это список, а не дикт.
r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()
print j['state']
for each in j['places']:
print each['latitude']
Я использую этот lib для доступа к вложенным ключам dict
https://github.com/mewwts/addict
import requests
from addict import Dict
r = requests.get('http://api.zippopotam.us/us/ma/belmont')
ad = Dict(r.json())
print j.state
print j.places[1]['post code'] # only work with keys without '-', space, or starting with number
5
автор: Ezequiel Bertti
19,2. json — кодировщик и декодер JSON — документация Python 3.4.10
JSON (нотация объектов JavaScript), определенная
RFC 7159 (который устарел RFC 4627 ) и
ECMA-404,
это легкий формат обмена данными, вдохновленный
Синтаксис литерала объекта JavaScript
(хотя это не строгое подмножество JavaScript).
json предоставляет API, знакомый пользователям стандартной библиотеки
модули маршала и рассола.
Кодирование базовой иерархии объектов Python:
>>> импортировать json >>> json.dumps (['foo', {'bar': ('baz', None, 1.0, 2)}]) '["foo", {"bar": ["baz", null, 1.0, 2]}]' >>> print (json.dumps ("\" foo \ bar ")) "\" фу \ бар " >>> печать (json.dumps ('\ u1234')) "\ u1234" >>> печать (json.dumps ('\\')) "\\" >>> print (json.dumps ({"c": 0, "b": 0, "a": 0}, sort_keys = True)) {"a": 0, "b": 0, "c": 0} >>> из io import StringIO >>> io = StringIO () >>> json.dump (['потоковый API'], io) >>> io.getvalue () '["потоковый API"]'
Компактное кодирование:
>>> импортировать json >>> json.дампы ([1,2,3, {'4': 5, '6': 7}], separators = (',', ':')) '[1,2,3, {"4": 5, "6": 7}]'
Довольно полиграфический:
>>> импортировать json >>> print (json.dumps ({'4': 5, '6': 7}, sort_keys = True, indent = 4)) { «4»: 5, «6»: 7 }
Расшифровка JSON:
>>> импортировать json >>> json.loads ('["foo", {"bar": ["baz", null, 1.0, 2]}]') ['foo', {'bar': ['baz', None, 1.0, 2]}] >>> json.loads ('"\\" foo \\ bar "') '"foo \ x08ar' >>> из io import StringIO >>> io = StringIO ('["потоковый API"]') >>> json.нагрузка (io) ['потоковый API']
Специализированное декодирование объекта JSON:
>>> импортировать json >>> def as_complex (dct): ... если '__complex__' в dct: ... вернуть комплекс (dct ['real'], dct ['imag']) ... вернуть dct ... >>> json.loads ('{"__ complex__": true, "real": 1, "imag": 2}', ... object_hook = as_complex) (1 + 2j) >>> импортировать десятичный >>> json.loads ('1.1', parse_float = decimal.Decimal) Десятичный ('1.1')
Расширение JSONEncoder:
>>> импортировать json >>> класс ComplexEncoder (json.JSONEncoder): ... def default (self, obj): ... если isinstance (obj, complex): ... вернуть [obj.real, obj.imag] ... # Разрешить методу по умолчанию базового класса вызвать TypeError ... вернуть json.JSONEncoder.default (self, obj) ... >>> json.dumps (2 + 1j, cls = ComplexEncoder) '[2.0, 1.0]' >>> ComplexEncoder (). Кодировать (2 + 1j) '[2.0, 1.0]' >>> список (ComplexEncoder (). iterencode (2 + 1j)) ['[2.0', ', 1.0', ']']
Использование json.tool из оболочки для проверки и красивой печати:
$ echo '{"json": "obj"}' | pyt
Чтение файла JSON с использованием Python
Полная форма JSON — это нотация объектов JavaScript.Это означает, что файл сценария (исполняемый), состоящий из текста на языке программирования, используется для хранения и передачи данных. Python поддерживает JSON через встроенный пакет под названием json
. Чтобы использовать эту функцию, мы импортируем пакет json в скрипт Python. Текст в JSON представлен строкой в кавычках, которая содержит значение в сопоставлении «ключ-значение» в пределах {}
.
Чтение из JSON
Загрузить объект JSON в Python довольно просто. Python имеет встроенный пакет json
, который можно использовать для работы с данными JSON.Это делается с помощью модуля json, который предоставляет нам множество методов, которые среди методов load (),
и load ()
помогут нам прочитать файл JSON.
Десериализация JSON
Десериализация JSON означает преобразование объектов JSON в соответствующие им объекты Python. Для этого используется метод load () / load ()
. Если вы использовали данные JSON из другой программы или полученные в виде строкового формата JSON, то их можно легко десериализовать с помощью load () / load ()
, который обычно используется для загрузки из строки, в противном случае корневой объект находится в list или dict.См. Следующую таблицу ниже.
ОБЪЕКТ JSON | ОБЪЕКТ PYTHON |
---|---|
объект | дикт |
массив | список |
строка | ул. |
null | Нет |
номер (внутр.) | внутренний |
номер (реальный) | поплавок |
правда | Истинно |
ложный | Ложь |
- json.load ():
json.load ()
принимает файловый объект, анализирует данные JSON, заполняет словарь Python данными и возвращает их вам.Синтаксис:
json.loads (объект файла)
Пример: Предположим, файл JSON выглядит так:
Мы хотим прочитать содержимое этого файла. Ниже представлена реализация.
импорт
json
f
=
открыть
(
'data.json '
,)
данные
=
json.load (f)
для
i
в
данных [
'emp_details'
]:
печать
(i)
ф. Закрытие ()
Выход:
- json.load (): Если у вас есть строка JSON, вы можете проанализировать ее с помощью метода
json.loads ()
.json.loads ()
не принимает путь к файлу, но содержимое файла в виде строки, используяfileobject.read ()
сjson.loads ()
, мы можем вернуть содержимое файла.Синтаксис:
json.loads (jsonstring) # для строки Json json.loads (fileobject.read ()) # для файлового объекта
Пример: Этот пример показывает чтение как из строки, так и из файла JSON.Используется показанный выше файл.
импорт
json
a
=
'{"name": "Bob", "languages": "English"}'
y
=
json.loads (a)
печать
(
"Строка JSON ="
, y)
печать
()
f
=
открыть
(
'data.json '
,
"r"
)
данные
=
json.loads (f.read ())
Кодирование и декодирование JSON с помощью Python
Введение
JSON (нотация объектов JavaScript) часто используется между сервером и веб-приложением. Пример данных JSON:
{ |
Модуль json позволяет выполнять преобразование между объектами JSON и Python.
Связанный курс:
Анализ данных с помощью Python Pandas
Примеры преобразования JSON
Преобразование JSON в объект Python (Dict)
Для преобразования JSON в словарь Python используйте это:
import json |
Преобразование JSON в объект Python (список)
Данные JSON можно напрямую сопоставить со списком Python.
import json |
Преобразование JSON в объект Python (с плавающей запятой)
Плавающие точки могут отображаться с помощью десятичной библиотеки.
import json |
Преобразование JSON в объект Python (пример)
Данные JSON часто содержат несколько объектов, пример того, как использовать это ниже:
import json |
json — Сериализатор нотации объектов JavaScript
Цель: | Кодировать объекты Python как строки JSON и декодировать строки JSON в объекты Python. |
---|---|
В наличии: | 2,6 |
Модуль json предоставляет API, аналогичный pickle для
преобразование объектов Python в памяти в сериализованное представление
известный как нотация объектов JavaScript (JSON). В отличие от рассола, JSON
имеет преимущество наличия реализаций на многих языках
(особенно JavaScript), что делает его пригодным для межприложений
общение. JSON, вероятно, наиболее широко используется для общения
между веб-сервером и клиентом в приложении AJAX, но не
ограничивается этой проблемной областью.
Кодирование и декодирование простых типов данных
Кодировщик понимает собственные типы Python по умолчанию (строка,
unicode, int, float, list, tuple, dict).
импорт json data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}] print 'DATA:', repr (данные) data_string = json.dumps (данные) напечатать 'JSON:', data_string
Значения кодируются способом, очень похожим на repr () в Python.
выход.
$ питон json_simple_types.py ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}] JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
Кодирование, то повторное декодирование может не давать точно такой же тип
объект.
импорт json data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}] data_string = json.dumps (данные) напечатать 'ENCODED:', data_string decoded = json.loads (строка_данных) print 'DECODED:', декодировано напечатайте 'ORIGINAL:', введите (данные [0] ['b']) напечатайте 'DECODED:', введите (decoded [0] ['b'])
В частности, строки преобразуются в Unicode, а кортежи становятся
списки.
$ питон json_simple_types_decode.ру ЗАПИСАНО: [{"a": "A", "c": 3.0, "b": [2, 4]}] РАСшифровано: [{u'a ': u'A', u'c ': 3.0, u'b': [2, 4]}] ОРИГИНАЛ: <тип "кортеж"> РАСШИФРОВАНО: <тип 'список'>
Расходные материалы для людей в сравнении с компактным выводом
Еще одно преимущество JSON перед pickle заключается в том, что результаты
человек читаемый. Функция dumps () принимает несколько аргументов для
сделать вывод еще красивее. Например, sort_keys сообщает
кодировщик для вывода ключей словаря в отсортированном виде вместо
случайный порядок.
импорт json data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}] print 'DATA:', repr (данные) unsorted = json.dumps (данные) напечатать 'JSON:', json.dumps (данные) print 'SORT:', json.dumps (data, sort_keys = True) first = json.dumps (данные, sort_keys = True) second = json.dumps (данные, sort_keys = True) print 'UNSORTED MATCH:', сначала несортированный == print 'SORTED MATCH:', first == second
Сортировка упрощает просмотр результатов на глаз, а также
можно сравнить вывод JSON в тестах.
$ питон json_sort_keys.py ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}] JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}] СОРТИРОВКА: [{"a": "A", "b": [2, 4], "c": 3.0}] Несортированный матч: ложь ОТДЕЛЕННЫЕ МАТЧИ: Верно
Для структур данных с высокой степенью вложенности необходимо указать значение
для отступа, поэтому вывод также будет красиво отформатирован.
импорт json data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}] print 'DATA:', repr (данные) print 'NORMAL:', json.dumps (data, sort_keys = True) print 'INDENT:', json.dumps (data, sort_keys = True, indent = 2)
Когда отступ — неотрицательное целое число, вывод более точно
похож на pprint, с ведущими пробелами для каждого уровня
структура данных, соответствующая уровню отступа.
$ питон json_indent.py ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}] НОРМАЛЬНЫЙ: [{"a": "A", "b": [2, 4], "c": 3.0}] INDENT: [ { «а»: «А», "b": [ 2, 4 ], «c»: 3,0 } ]
Подробный вывод, подобный этому, увеличивает количество байтов, необходимых для
однако передавать тот же объем данных, поэтому это не
вещь, которую вы обязательно хотите использовать в производственной среде. В
на самом деле, вы можете захотеть настроить параметры разделения данных в
закодированный вывод, чтобы сделать его еще более компактным, чем по умолчанию.
импорт json data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}] print 'DATA:', repr (данные) print 'repr (данные):', len (repr (данные)) напечатать 'дампы (данные):', len (json.dumps (данные)) print 'dumps (data, indent = 2):', len (json.dumps (data, indent = 2)) print 'дампы (данные, разделители):', len (json.dumps (data, separators = (',', ':')))
Аргумент разделителей для dumps () должен быть кортежем
содержащие строки для разделения элементов в списке и ключей от
значения в словаре.По умолчанию (‘,’, ‘:’). Удалив
пробела, мы можем произвести более компактный вывод.
$ питон json_compact_encoding.py ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}] репр (данные): 35 свалок (данных): 35 свалки (данные, отступ = 2): 76 дампов (данных, разделителей): 29
Словари кодирования
Формат JSON предполагает, что ключи словаря будут строками. Если
у вас есть другие типы ключей в вашем словаре, вы пытаетесь закодировать
объект выдаст ValueError .В одну сторону
Чтобы обойти это ограничение, нужно пропустить нестроковые ключи, используя
аргумент skipkeys:
импорт json data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0, ('d',): 'D tuple'}] print 'Первая попытка' пытаться: распечатать json.dumps (данные) кроме (TypeError, ValueError) как err: напечатайте 'ERROR:', err Распечатать print 'Вторая попытка' напечатать json.dumps (данные, skipkeys = True)
Вместо того, чтобы вызывать исключение, нестроковый ключ просто
игнорируется.
$ python json_skipkeys.ру Первая попытка ОШИБКА: ключи должны быть строкой Вторая попытка [{"a": "A", "c": 3.0, "b": [2, 4]}]
Работа с вашими собственными типами
Все примеры до сих пор использовали встроенные типы Pythons, потому что
они изначально поддерживаются json. Это не редкость,
конечно, чтобы иметь свои собственные типы, которые вы хотите кодировать как
Что ж. Это можно сделать двумя способами.
Во-первых, нам понадобится класс для кодирования:
класс MyObj (объект): def __init __ (self, s): я.s = s def __repr __ (сам): return ''% self.s
Простым способом кодирования экземпляра MyObj является определение
функция для преобразования неизвестного типа в известный тип. У тебя нет
чтобы выполнить кодирование самостоятельно, просто конвертируйте один объект в другой.
импорт json импорт json_myobj obj = json_myobj.MyObj ('здесь идет значение экземпляра') print 'Первая попытка' пытаться: напечатать json.dumps (obj) кроме TypeError, err: напечатайте 'ERROR:', err def convert_to_builtin_type (obj): print 'default (', repr (obj), ')' # Преобразовать объекты в словарь их представления d = {'__class __': объект.__class __.__ name__, '__module __': obj .__ module__, } d.update (объект__ dict__) вернуться д Распечатать напечатать 'По умолчанию' напечатать json.dumps (obj, по умолчанию = convert_to_builtin_type)
В convert_to_builtin_type () экземпляры классов не распознаются
by json конвертируются в словари с достаточной информацией
для воссоздания объекта, если программа имеет доступ к модулям Python
необходимо.
$ питон json_dump_default.py Первая попытка ОШИБКА:не сериализуемый JSON По умолчанию по умолчанию ( ) {"s": "здесь идет значение экземпляра", "__module__": "json_myobj", "__class__": "MyObj"}
Чтобы декодировать результаты и создать экземпляр MyObj, нам нужно связать
в декодер, чтобы мы могли импортировать класс из модуля и
создать экземпляр.Для этого мы используем аргумент object_hook для
загружает ().
object_hook вызывается для каждого словаря, декодированного из
входящий поток данных, что дает нам возможность преобразовать словарь в
другой тип объекта. Функция ловушки должна возвращать объект, который она
хочет, чтобы вызывающее приложение получало вместо словаря.
импорт json def dict_to_object (d): если '__class__' в d: имя_класса = d.pop ('__ класс__') имя_модуля = d.pop ('__ module__') модуль = __импорт __ (имя_модуля) print 'МОДУЛЬ:', модуль class_ = getattr (модуль, имя_класса) print 'CLASS:', class_ args = dict ((ключ.encode ('ascii'), value) для ключа, значение в d.items ()) print 'INSTANCE ARGS:', args inst = class _ (** аргументы) еще: inst = d возвратиться encoded_object = '[{"s": "здесь идет значение экземпляра", "__module__": "json_myobj", "__class__": "MyObj"}]' myobj_instance = json.loads (encoded_object, object_hook = dict_to_object) распечатать myobj_instance
Поскольку json преобразует строковые значения в объекты Unicode, нам нужно
перекодировать их как строки ASCII, прежде чем использовать их как ключевое слово
аргументы конструктору класса.
$ питон json_load_object_hook.py МОДУЛЬ: <модуль 'json_myobj' из '/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/json/json_myobj.pyc'> КЛАСС: <класс 'json_myobj.MyObj'> АРГИИ ЭКЗАМЕНА: {'s': u'значение экземпляра идет здесь '} []
Подобные хуки доступны для встроенных типов целых чисел
(parse_int), числа с плавающей запятой (parse_float) и
константы (parse_constant).
Классы кодировщика и декодера
Помимо уже рассмотренных нами функций удобства,
Модуль json предоставляет классы для кодирования и декодирования.когда
используя классы напрямую, вы получаете доступ к дополнительным API и можете
создавать подклассы для настройки их поведения.
JSONEncoder предоставляет итеративный интерфейс для создания «блоков».
закодированных данных, что упрощает запись в файлы или сеть
сокеты без необходимости представлять всю структуру данных в
объем памяти.
импорт json кодировщик = json.JSONEncoder () data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}] для части в encoder.iterencode (data): print 'PART:', часть
Как видите, вывод формируется в логических единицах, а не в
на основе любого значения размера.
$ питон json_encoder_iterable.py ЧАСТЬ: [ ЧАСТЬ: { ЧАСТЬ: "а" ЧАСТЬ: : ЧАСТЬ: «А» ЧАСТЬ: , ЧАСТЬ: "c" ЧАСТЬ: : ЧАСТЬ: 3.0 ЧАСТЬ: , ЧАСТЬ: "b" ЧАСТЬ: : ЧАСТЬ 2 ЧАСТЬ:, 4 ЧАСТЬ: ] ЧАСТЬ: } ЧАСТЬ: ]
Метод encode () в основном эквивалентен
» .join (encoder.iterencode ()) с дополнительной проверкой ошибок
фронт.
Для кодирования произвольных объектов мы можем переопределить метод default ()
с реализацией, аналогичной той, что мы использовали выше в
convert_to_builtin_type ().
импорт json импорт json_myobj класс MyEncoder (json.JSONEncoder): def default (self, obj): print 'default (', repr (obj), ')' # Преобразовать объекты в словарь их представления d = {'__class __': obj .__ class __.__ name__, '__module __': obj .__ module__, } d.update (объект__ dict__) вернуться д obj = json_myobj.MyObj ('внутренние данные') печать obj напечатать MyEncoder (). encode (obj)
Вывод такой же, как и в предыдущей реализации.
$ python json_encoder_default.рупо умолчанию ( ) {"s": "внутренние данные", "__module__": "json_myobj", "__class__": "MyObj"}
Для декодирования текста и последующего преобразования словаря в объект требуется
немного больше работы по настройке, чем в нашей предыдущей реализации, но не
много.
импорт json класс MyDecoder (json.JSONDecoder): def __init __ (сам): json.JSONDecoder .__ init __ (self, object_hook = self.dict_to_object) def dict_to_object (self, d): если '__class__' в d: имя_класса = d.поп ('__ класс__') имя_модуля = d.pop ('__ module__') модуль = __импорт __ (имя_модуля) print 'МОДУЛЬ:', модуль class_ = getattr (модуль, имя_класса) print 'CLASS:', class_ args = dict ((key.encode ('ascii'), value) для ключа, значение в d.items ()) print 'INSTANCE ARGS:', args inst = class _ (** аргументы) еще: inst = d возвратиться encoded_object = '[{"s": "здесь идет значение экземпляра", "__module__": "json_myobj", "__class__": "MyObj"}]' myobj_instance = MyDecoder ().декодировать (encoded_object) распечатать myobj_instance
И вывод такой же, как в предыдущем примере.
$ питон json_decoder_object_hook.py МОДУЛЬ: <модуль 'json_myobj' из '/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/json/json_myobj.pyc'> КЛАСС: <класс 'json_myobj.MyObj'> АРГИИ ЭКЗАМЕНА: {'s': u'значение экземпляра идет здесь '} []
Работа с потоками и файлами
До сих пор во всех примерах мы предполагали, что можем (и
должен) содержать закодированную версию всей структуры данных в
память за один раз.С большими структурами данных может быть предпочтительнее
для записи кодировки непосредственно в файловый объект. Удобство
функции load () и dump () принимают ссылки на файловые
объект для чтения или записи.
импорт json импортировать временный файл data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}] f = tempfile.NamedTemporaryFile (режим = 'w +') json.dump (данные, f) f.flush () напечатать open (f.name, 'r'). read ()
Сокет будет работать так же, как и обычный дескриптор файла.
здесь используется.
$ питон json_dump_file.py [{"a": "A", "c": 3.0, "b": [2, 4]}]
Хотя он не оптимизирован для чтения только части данных за раз,
функция load () по-прежнему предлагает преимущество инкапсуляции
логика генерации объектов из потокового ввода.
импорт json импортировать временный файл f = tempfile.NamedTemporaryFile (режим = 'w +') f.write ('[{"a": "A", "c": 3.0, "b": [2, 4]}]') f.flush () f.seek (0) напечатать json.load (f)
$ питон json_load_file.py [{u'a ': u'A', u'c ': 3.0, u'b ': [2, 4]}]
Смешанные потоки данных
JSONDecoder включает метод raw_decode () для декодирования
структура данных, за которой следуют другие данные, например данные JSON с завершающим
текст. Возвращаемое значение — это объект, созданный путем декодирования ввода.
data и индекс в этих данных, указывающий, где остановилось декодирование.
импорт json декодер = json.JSONDecoder () def get_decoded_and_remainder (input_data): obj, end = decoder.raw_decode (input_data) осталось = input_data [конец:] возврат (объект, конец, оставшийся) encoded_object = '[{"a": "A", "c": 3.0, "b": [2, 4]}] ' extra_text = 'Этот текст не JSON.' напечатайте "сначала JSON:" объект, конец, оставшийся = get_decoded_and_remainder ('' .join ([encoded_object, extra_text])) print 'Object:', obj print 'Конец проанализированного ввода:', конец print 'Остающийся текст:', repr (оставшийся) Распечатать напечатайте 'JSON встроенный:' пытаться: obj, конец, оставшийся = get_decoded_and_remainder ( '' .join ([дополнительный_текст, кодированный_объект, дополнительный_текст]) ) кроме ValueError, ошибка: напечатайте 'ERROR:', err
К сожалению, это работает, только если объект появляется в начале
входа.
$ питон json_mixed_data.py Сначала JSON: Объект: [{u'a ': u'A', u'c ': 3.0, u'b': [2, 4]}] Конец проанализированного ввода: 35 Остающийся текст: "Этот текст не JSON". Встроенный JSON: ОШИБКА: не удалось декодировать объект JSON.
См. Также
- JSON
- Стандартная библиотека документации для этого модуля.
- Нотация объектов JavaScript
- Домашняя страница JSON с документацией и реализациями на других языках.
- http: // code.google.com/p/simplejson/
- simplejson, от Боба Ипполито и др., Является внешним
поддерживаемая версия для разработки библиотеки json включена
с Python 2.6 и Python 3.0. Он поддерживает в обратном направлении
совместимость с Python 2.4 и Python 2.5. - jsonpickle
- jsonpickle позволяет сериализовать любой объект Python в JSON.
- Сохранение данных и обмен
- Другие примеры хранения данных из программ Python.
Python JSON |菜鸟 教程
章节 我们 将为 大家 介绍 如何 使用 Python 语言 来 编码 和 解码 JSON 对象。
JSON (нотация объектов JavaScript) 是 一种 轻量级 的 数据 交换 格式 , 易于 人 阅读 和 编写。
JSON 函数
使用 JSON 函数 需要 导入 json 库 : импорт json 。
函数 | 描述 |
---|---|
json.дампы | 将 Python 对象 编码 成 JSON 字符串 |
json.loads | 将 已 编码 的 JSON 字符串 解码 为 Python 对象 |
json.dumps
json.dumps 用于 将 Python 对象 编码 成 JSON 字符串。
语法
json.dumps (obj, skipkeys = False, sure_ascii = True, check_circular = True, allow_nan = True, cls = None, indent = None, separators = None, encoding = "utf-8", default = None, sort_keys = False, ** кВт)
实例
以下 实例 将 数组 编码 为 JSON 格式 数据 :
实例
#! / usr / bin / python
import json
data = [{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}]
data2 = json.дампы (данные)
печать (данные2)
以上 代码 执行 结果 为 :
[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]
使用 参数 让 JSON 数据 格式化 输出 :
实例
#! / usr / bin / python
import json
data = [{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}]
data2 = json.dumps ({‘a’: ‘Runoob’, ‘b’: 7}, sort_keys = True, indent = 4, separators = (‘,’, ‘:’))
print (data2)
以上 代码 执行 结果 为 :
{ "a": "Runoob", "b": 7 }
питон, json, 的 转化 对照 表 :
Python | JSON |
---|---|
дикт | объект |
список, кортеж | массив |
ул, юникод | строка |
int, long, float | номер |
Истинно | правда |
Ложь | ложь |
Нет | null |
json.грузы
json.loads 解码 JSON 数据。 该 函数 Python 字段 的 数据 类型。
语法
json.loads (s [, кодировка [, cls [, object_hook [, parse_float [, parse_int [, parse_constant [, object_pairs_hook [, ** kw]]]]]]]])
实例
以下 实例 展示 了 Python 如何 解码 JSON 对象 :
实例
#! / usr / bin / python
import json
jsonData = ‘{«a»: 1, «b»: 2, «c»: 3, «d»: 4, «e»: 5}’;
текст = json.loads (jsonData)
печать (текст)
以上 代码 执行 结果 为 :
{u'a ': 1, u'c': 3, u'b ': 2, u'e': 5, u'd ': 4}
json 到 python 的 类型 对照 表 :
JSON | Python |
---|---|
объект | дикт |
массив | список |
строка | юникод |
номер (внутр.) | int, длинный |
номер (реальный) | поплавок |
правда | Истинно |
ложный | Ложь |
null | Нет |
更多 内容 参考 : https: // docs.python.org/2/library/json.html
фунтов стерлингов
使用 第三方 库 : Demjson
Demjson python 的 第三方 模块 库 , 可 用于 编码 和 JSON 数据 , 包含 了 JSONLint 的 格式化 及 校验 功能。
Github 地址 : https: //github.com/dmeranda/demjson
官方 地址 : http: //deron.meranda.us/python/demjson/
环境 配置
在 使用 Demjson 编码 或 解码 JSON 数据 前 , 我们 需要 先 安装 Demjson 模块。 本 教程 我们 会 下载 Demjson 并 安装 :
$ tar -xvzf demjson-2.2.3.tar.gz $ cd demjson-2.2.3 $ python setup.py установить
更多 安装 介绍 查看 : http: // deron.meranda.us/python/demjson/install
JSON 函数
函数 | 描述 |
---|---|
кодировать | 将 Python 对象 编码 成 JSON 字符串 |
декодировать | 的 JSON 字符串 Python 对象 |
кодировать
Python encode () 函数 用于 将 Python 对象 编码 成 JSON 字符串。
语法
demjson.encode (self, obj, nest_level = 0)
实例
以下 实例 将 数组 编码 为 JSON 格式 数据 :
实例
#! / usr / bin / python
import demjson
data = [{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}]
json = demjson.кодировать (данные)
печать (json)
以上 代码 执行 结果 为 :
[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
декодировать
Python 使用 demjson.decode () 函数 解码 JSON 数据。 该 函数 Python 字段 的 数据 类型。
语法
demjson.decode (сам, txt)
实例
以下 实例 展示 了 Python 如何 解码 JSON 对象 :
实例
#! / usr / bin / python
import demjson
json = ‘{«a»: 1, «b»: 2, «c»: 3, «d»: 4, «e»: 5}’;
текст = demjson.декодировать (json)
печать (текст)
以上 代码 执行 结果 为 :
{u'a ': 1, u'c': 3, u'b ': 2, u'e': 5, u'd ': 4}
json-py скачать | SourceForge.net
- Присоединиться / Войти
- Программное обеспечение с открытым исходным кодом
- Программное обеспечение для бизнеса
- Блог
- Около
- Справка
- Подключить
- Конфиденциальность
- Подробнее
- Статьи
- Создать
- Самые популярные проекты
- Сделки
- Статус сайта
- @sfnet_ops
- @sourceforge
- Документация сайта
- Запрос в службу поддержки
- Условия
- Отказаться
- Объявить
о нет! Не удалось загрузить некоторые стили.😵
Пожалуйста, попробуйте перезагрузить эту страницу
Помогите
Создайте
Присоединиться
Авторизоваться
Программное обеспечение с открытым исходным кодом
- Бухгалтерский учет
- CRM
- Бизнес-аналитика
- CAD
- PLM
- ударов в минуту
- Управление проектами
- Управление знаниями
- Развитие
- Продажа
- Электронная коммерция
- ERP
- HR
- Управление ИТ
- ИТ-безопасность
- Офис
- Наука и техника
- Игры
- Все программное обеспечение
Программное обеспечение для бизнеса
- CRM
CRM
Обслуживание клиентов
Опыт работы с клиентами
Торговая точка
Ведущее управление
Управление событиями
Опрос
- Финансы
Финансы
Бухгалтерский учет
Выставление счетов и выставление счетов
Бюджетирование
Процесс оплаты
Отчет о затратах
- Разработка приложения
Разработка приложений
Управление жизненным циклом приложений
Интеграция
Разработка с низким кодом
Разработка без кода
Разработка мобильных приложений
Управление тестированием
UX
- Аналитика
Аналитика
Большие данные
Бизнес-аналитика
Прогнозная аналитика
.