Розбір JSON Python: простий підручник

Розбір JSON Python: простий підручник

JSON (розшифровується як «JavaScript Object Notation») - це текстовий формат, який полегшує обмін даними між різними програмами. Наприклад, додаток, написаний на C++ роботі в Windows можна легко обмінюватися даними JSON з додатком, написаним на python і працює в Linux. Його простота і гнучкість призвели до широкого використання в останні роки, особливо щодо більш ранніх форматів на основі XML.

Існують бібліотеки та набори інструментів для аналізу та генерації JSON практично будь-якою мовою і в будь-якому середовищі. Ця стаття присвячена методам і проблемам, що виникають при обробці JSON з використанням python.


Деякі зразки JSON

Найбільш поширена сутність JSON, з якою ви зіткнетеся, - це об'єкт: набір відображення ключ-значення у форматі нижче.

person.json:

{ ""firstName"": ""Alice"", ""lastName"": ""Hall"", ""age"": 35 }

Ось як ви можете уявити масив об'єктів. У цьому перегляді кожен елемент масиву є об'єктом. Нижче наводиться приклад заробітної плати бейсболістів.

salaries.json:

[ { ""year"": 1985, ""teamId"": ""ATL"", ""leagueId"": ""NL"", ""playerId"": ""barkele01"", ""salary"": 870000 }, { ""year"": 1985, ""teamId"": ""ATL"", ""leagueId"": ""NL"", ""playerId"": ""bedrost01"", ""salary"": 550000 } ]

Звичайно, ви також можете представляти масив скалярів. Це виглядає так:

[ ""hello"", ""world"", 35 ]


Розбір JSON в Python

Python надає модуль json, який можна використовувати як для аналізу JSON, так і для генерації JSON з об'єктів і списків python.

У наступному фрагменті коду показано, як відкрити файл JSON і завантажити дані в змінну.

import json with open('sample.json', 'r') as fp: obj = json.load(fp)

Якщо у вас є рядок, що містить дані JSON, ви можете перетворити його на об'єкт (або список) python за допомогою наступного:

obj = json.loads(""""""{ ""firstName"": ""Alice"", ""lastName"": ""Hall"", ""age"": 35 }"""""")

Щоб проаналізувати URL-адресу JSON, ви можете створити об'єкт URL-адреси за допомогою urllib2 і використовувати json.load (), як і раніше.

import urllib2, json url = urllib2.urlopen('http://site.com/sample.json') obj = json.load(url)


Обробка помилок

Коли у JSON є помилки, ви отримаєте ValueError. Ви можете впоратися з цим і зробити коригувальні дії, якщо потрібно.

try: obj = json.loads(""""""{ ""firstName"": ""Alice"", ""lastName: ""Hall"", ""age"": 35 }"""""") except ValueError: print ""error loading JSON"

Розбір JSON з командного рядка

Іноді корисно проаналізувати JSON за допомогою командного рядка python, можливо, для перевірки на наявність помилок або для отримання вихідних даних з хорошим відступом.

cat glossary.json # prints {""glossary"": {""GlossDiv"": {""GlossList"": {""GlossEntry"": {""GlossDef"": {""GlossSeeAlso"": [""GML"", ""XML""], ""para"": ""A meta-markup language, used to create markup languages such as DocBook.""}, ""GlossSee"": ""markup"", ""Acronym"": ""SGML"", ""GlossTerm"": ""Standard Generalized Markup Language"", ""Abbrev"": ""ISO 8879:1986"", ""SortAs"": ""SGML"", ""ID"": ""SGML""}}, ""title"": ""S""}, ""title"": ""example glossary""}}

Для отримання відступу з вказаного вище файла JSON ви можете зробити наступне:


python -mjson.tool glossary.json # prints { ""glossary"": { ""GlossDiv"": { ""GlossList"": { ""GlossEntry"": { ""Abbrev"": ""ISO 8879:1986"", ""Acronym"": ""SGML"", ""GlossDef"": { ""GlossSeeAlso"": [ ""GML"", ""XML"" ], ""para"": ""A meta-markup language, used to create markup languages such as DocBook."" }, ""GlossSee"": ""markup"", ""GlossTerm"": ""Standard Generalized Markup Language"", ""ID"": ""SGML"", ""SortAs"": ""SGML"" } }, ""title"": ""S"" }, ""title"": ""example glossary"" } }

І ось як ви можете завантажити об'єкт JSON в Python і витягти тільки те, що вам потрібно.

python -c 'import json; fp = open(""glossary.json"", ""r""); obj = json.load(fp); fp.close(); print obj[""glossary""][""title""]' # prints example glossary

Доступ до даних

Після того, як ви завантажили дані JSON в змінну python, ви можете отримати доступ до даних, як якщо б ви використовували будь-який запит Python (або список залежно від обставин). Наприклад, ви можете отримати доступ до вказаних вище даних JSON так:

firstName = obj[""firstName""] lastName = obj[""Hall""] age = obj[""age""]


Типи даних

Типи даних автоматично визначаються з даних. Зверніть увагу, що вік аналізується як ціле число.

print type(obj[""firstName""]), type(obj[""lastName""]), type(obj[""age""]) # prints <type 'unicode'> <type 'unicode'> <type 'int'>

Наступна таблиця перетворення використовується для перетворення з JSON на python.

Розбір JSON з використанням власного класу

За замовчуванням JSON-об'єкт аналізується в python dict. Іноді вам може знадобитися автоматично створити об'єкт вашого власного класу з даних JSON. Ви можете зробити це, вказавши функцію object_hook, яка обробляє перетворення. У наступному прикладі показано як.

Ось клас користувача, який представляє Person.


class Person: def __init__(self, firstName, lastName, age): self.firstName = firstName self.lastName = lastName self.age = age def __str__(self): return '{{""firstName"" = ""{0}"",""lastName"" = ""{1}"", ""age"" = {2}}}'.format(self.firstName, self.lastName, self.age)

Примірник цього класу створюється шляхом передачі необхідних аргументів наступним чином:

person = Person(""Crystal"", ""Newell"", 27)

Щоб використовувати цей клас для створення екземплярів під час синтаксичного аналізу JSON, вам потрібна функція object_hook, визначена наступним чином: функція отримує диктон python і повертає об'єкт правильного класу.

def obj_creator(d): return Person(d['firstName'], d['lastName'], d['age'])

Тепер ви можете використовувати цю функцію object_hook при виклику аналізатора JSON.

with open('sample.json', 'r') as fp: obj = json.load(fp, object_hook = obj_creator) print obj # prints {""firstName"" = ""Alice"",""lastName"" = ""Hall"", ""age"" = 35}

Приклади використання JSON

JSON надзвичайно популярний в наші дні. Багато веб-сайтів і програм SaaS (Software As A Service) пропонують висновок у форматі JSON, який може використовуватися додатками безпосередньо. Деякі із загальнодоступних включають в себе:

Якщо ви шукаєте більше прикладів того, як ефективно його використовувати, ознайомтеся з цим керівництвом зі створення бота в соціальних мережах з використанням Python.

Чи використовуєте ви JSON для споживання або надання послуг? І ви використовуєте Python у своєму технологічному стеку? Поясніть у коментарях нижче.

Image

Publish modules to the "offcanvas" position.