Разбор JSON в Python: Простое руководство
Программирование

Разбор JSON в Python: Простое руководство

Существуют библиотеки и наборы инструментов для разбора и генерации JSON практически из любого языка и среды. Эта статья посвящена методам и проблемам, возникающим при разборе 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
}''')

Чтобы разобрать JSON URL, вы можете создать объект 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'

Типы данных

Типы данных определяются автоматически на основе данных. Обратите внимание, что 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 dict и возвращает объект нужного класса

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, который может быть использован непосредственно приложениями. Некоторые из общедоступных включают:

  • StackOverflow/StackExchange. Вот URL, который возвращает список вопросов в формате JSON.
  • GitHub предлагает JSON api по адресу https://developer.github.com/v3/.
  • А вот API Flickr: https://developer.yahoo.com/flickr/.

Если вы ищете больше примеров того, как использовать его с пользой, ознакомьтесь с этим руководством по созданию бота для социальных сетей с помощью Python

Используете ли вы JSON для потребления или предоставления услуг? И используете ли вы python в своем технологическом стеке? Расскажите об этом в комментариях ниже

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий