Как считать json python
Перейти к содержимому

Как считать json python

  • автор:

Как правильно читать json python

изучая Python, а именно библиотеку json, столкнулся с непониманием как правильно мне извлечь только те данные, которые нужны? Пример кусочка json файла ниже. как мне извлечь только id и name?

Отслеживать
7,722 13 13 золотых знаков 25 25 серебряных знаков 54 54 бронзовых знака
задан 16 янв 2022 в 22:19
Не человек и не кот Не человек и не кот
52 7 7 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Для начала Вам нужно распарсить его, то есть преобразовать из строки в объект одного из стандартных типов Python. Для этого Вы можете воспользоваться библиотекой json , а точнее методом json.loads .

Данный метод вернёт Вам словарь. Извлекайте из него значения по ключу, пока не доберётесь до нужного.

Пример:

import json s = '<"data":<"products":[<"colors":[<"name":"белый","id":16777215>]>]>>' d = json.loads(s) for product in d['data']['products']: for color in product['colors']: print(color['name']) print(color['id']) 

stdout:

белый 16777215 

Интерпретация JSON в Python – как читать файлы JSON

img

JSON (JavaScript Object Notation – нотация объектов JavaScript) – это популярный способ структурирования данных. Он используется для обмена информацией между веб-приложением и сервером. Но как прочитать файл JSON в Python?

В этой статье я покажу вам, как использовать методы json.loads() и json.load() для интерпретации (или как еще говорят парсинга) и чтения файлов и строк JSON.

Синтаксис JSON

Прежде чем мы приступим к интерпретации и чтению файла JSON, сначала нам нужно разобраться с основным синтаксисом. Подробнее про JSON можно почитать в этой статье. Синтаксис JSON выглядит как объектный литерал JavaScript с парами ключ-значение.

Вот пример данных JSON с данными организации:

Как парсить строки JSON в Python

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

import json

Если вам необходимо проинтерпретировать строку JSON, возвращающую словарь, то вы можете воспользоваться методом json.loads() .

import json # assigns a JSON string to a variable called jess jess = '' # parses the data and assigns it to a variable called jess_dict jess_dict = json.loads(jess) # Printed output: print(jess_dict)

Как парсить и читать файлы JSON в Python

В данном примере мы имеем файл в формате JSON с именем fcc.json , который содержит те же данные, что и ранее, касающиеся курсов, которые предлагает сайт.

Если вы хотите прочитать этот файл, то для начала вам нужно использовать встроенную в Python функцию open() с режимом чтения. Мы используем ключевое слово with , чтобы убедиться, что файл закрыт.

with open('fcc.json', 'r') as fcc_file:

Если файл не может быть открыт, то мы получим ошибку OSError . Это пример ошибки «FileNotFoundError» при опечатке в имени файла fcc.json .

FileNotFoundError

Затем мы можем проинтерпретировать файл, используя метод json.load() и присвоить его переменной с именем fcc_data .

fcc_data = json.load(fcc_file)

И в конце мы должны напечатать результат.

print(fcc_data)

Вот так будет выглядеть полный код:

import json with open('fcc.json', 'r') as fcc_file: fcc_data = json.load(fcc_file) print(fcc_data)

Как красиво напечатать данные JSON в Python

Если мы посмотрим на то, как печатаются данные, то увидим, что все данные JSON печатаются в одной строке.

Данные JSON

Однако такой формат вывода может быть затруднительным для чтения. И чтобы это исправить, мы можем реализовать метод json.dumps() с параметром indent (отступ).

В данном примере мы сделаем отступ в 4 пробела и будем печатать данные в более удобном для чтения формате.

print(json.dumps(fcc_data, indent=4))

indent

Также мы можем отсортировать ключи в алфавитном порядке, используя параметр sort_keys и установив его значение на True .

print(json.dumps(fcc_data, indent=4, sort_keys=True))

sort_keys

Заключение

JSON – это популярный способ структурирования данных, который используется для обмена информацией между веб-приложением и сервером.

Если вам необходимо проинтерпретировать строку JSON, которая возвращает словарь, то вы можете использовать метод json.loads() .

Если вам необходимо проинтерпретировать файл JSON, который возвращает словарь, то вы можете использовать метод json.load() .

Как парсить JSON в Python

Мы покажем вам весь процесс импорта json и его использования для парсинга JSON в Python, с полезной таблицей преобразований JSON-Python. Независимо от того, опытный вы разработчик Python или начинающий, с помощью этого пошагового руководства вы сможете научиться парсить JSON как профессионал!

4 min read
Antonello Zanini

Из этого учебника вы узнаете:

  • Что такое JSON и как с ним работать в Python
  • Как парсить JSON в Python с помощью модуля json
  • Является ли json лучшим вариантом для парсинга JSON

Введение в JSON в Python

Перед тем как углубиться в парсинг JSON с помощью Python, давайте разберемся, что такое JSON и как его можно использовать в Python.

Что такое JSON?

JSON, что является сокращенной аббревиатурой JavaScript Object Notation, — это удобный формат для обмена данными. Он прост для чтения и записи людьми, а также для машинного анализа и генерации. Это делает его одним из самых популярных форматов данных. В частности, JSON стал настоящим веб-языком, который широко используется для передачи данных между серверами и веб-приложениями через API.

Вот пример JSON:

 < "name": "Maria Smith", "age": 32, "isMarried": true, "hobbies": ["reading", "jogging"], "address": < "street": "123 Main St", "city": "San Francisco", "state": "CA", "zip": "12345" >, "phoneNumbers": [ < "type": "home", "number": "555-555-1234" >, < "type": "work", "number": "555-555-5678" >], "notes": null >

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

Как работать с JSON в Python

Python поддерживает JSON с помощью модуля json, который является частью стандартной библиотеки Python. Это значит, что вам не нужно устанавливать дополнительную библиотеку для работы с JSON в Python. Вы можете импортировать json следующим образом:

import json

Встроенная в Python библиотека json предоставляет полноценный API для работы с JSON. В частности, в ней есть две ключевые функции: loads и load . Первая позволяет парсить строчные данные JSON. Обратите внимание, что, несмотря на то, что ее название кажется множественным, окончание «s» означает «string». Таким образом, ее следует читать как «load-s». Вторая же предназначена для парсинга данных JSON в байты.

С помощью этих двух методов json предоставляет вам возможность преобразовывать данные JSON в эквивалентные объекты Python — такие, как словари и списки, и наоборот. Кроме того, модуль json позволяет создавать пользовательские кодировщики и декодировщики для работы с конкретными типами данных.

Читайте дальше, чтобы узнать, как использовать библиотеку json для парсинга JSON в Python!

Парсинг JSON с помощью Python

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

Преобразование JSON String в словарь Python

Предположим, что у вас есть некоторые данные JSON, хранящиеся в строке, и вы хотите преобразовать их в словарь Python. Вот как выглядят данные JSON:

А это его строковое представление в Python:

smartphone_json = '' 

Рассмотрите возможность использования в Python тройных кавычек для хранения длинных многострочных данных JSON в формате String.

Вы можете проверить, что слово smartphone содержит валидные в Python данные типа String, с помощью приведенной ниже строки:

print(type(smartphone))

Это будет напечатано:

str расшифровывается как string и означает, что переменная smartphone имеет текстовый тип.

Спарсите строку JSON, содержащуюся в переменной smartphone, в словарь Python с помощью метода json.loads() следующим образом:

import json # JSON string smartphone_json = '' # from JSON string to Python dict smartphone_dict = json.loads(smartphone_json) # verify the type of the resulting variable print(type(smartphone_dict)) # dict

Если вы запустите этот фрагмент, то получите:

Фантастика! Теперь smartphone _dict содержит валидный словарь Python!

Таким образом, для преобразования строки JSON в словарь Python достаточно передать правильную строку JSON в функцию json.loads()

Теперь вы можете получить доступ к полученным полям словаря как обычно:

product = smartphone_dict['product'] # smartphone priced = smartphone['price'] # 999.99 colors = smartphone['colors'] # ['black', 'white', 'red', 'blue']

Следует помнить, что функция json.loads() не всегда возвращает словарь. В частности, возвращаемый тип данных зависит от входной строки. Например, если строка JSON содержит данные типа flat, она будет преобразована в соответствующий примитивный тип данных Python:

import json json_string = '15.5' float_var = json.loads(json_string) print(type(float_var)) #

Аналогично, содержащая список массивов строка JSON станет списком Python:

 import json json_string = '[1, 2, 3]' list_var = json.loads(json_string) print(json_string) #

Посмотрите на приведенную ниже таблицу преобразования, чтобы увидеть, как значения JSON преобразуются в данные Python с помощью json :

JSON-значение Данные Python
string str
number (integer) int
number (real) float
true True
false False
null None
array list
object dict

Преобразование JSON API Response в словарь Python

Представьте, что вам нужно сделать API и преобразовать его JSON-ответ в словарь Python. В приведенном ниже примере мы вызовем следующую конечную точку API из проекта Placeholder, чтобы получить некоторые поддельные JSON-данные:

https://jsonplaceholder.typicode.com/todos/1

Этот RESTFul API возвращает ответ в формате JSON, представленный ниже:

Вы можете вызвать этот API с помощью модуля urllib из стандартной библиотеки и преобразовать полученный JSON в словарь Python следующим образом:

import urllib.request import json url = "https://jsonplaceholder.typicode.com/todos/1" with urllib.request.urlopen(url) as response: body_json = response.read() body_dict = json.loads(body_json) user_id = body_dict['userId'] # 1

urllib.request.urlopen() выполняет вызов API и возвращает объект HTTPResponse . Его метод read() затем используется для получения тела ответа body_json, которое содержит ответ API в виде строки JSON. Наконец, эта строка может быть спарсена в словарь Python с помощью json.loads() , как объяснялось ранее.

Аналогичным образом можно добиться того же результата с помощью requests:

import requests import json url = "https://jsonplaceholder.typicode.com/todos/1" response = requests.get(url) body_dict = response.json() user_id = body_dict['userId'] # 1

Обратите внимание, что метод .json() автоматически преобразует объект ответа, содержащий данные JSON, в соответствующую структуру данных Python.

Отлично! Теперь вы знаете, как спарсить ответ JSON API в Python с помощью urllib и requests .

Загрузка файла JSON в словарь Python

Предположим, у вас есть некоторые данные JSON, хранящиеся в файле smartphone.json , как показано ниже:

< "name": "iPear 23", "colors": ["black", "white", "red", "blue"], "price": 999.99, "inStock": true, "dimensions": < "width": 2.82, "height": 5.78, "depth": 0.30 >, "features": [ "5G", "HD display", "Dual camera" ] >

Ваша цель — прочитать файл JSON и загрузить его в словарь Python. Достичь этого можно с помощью приведенного ниже фрагмента:

import json with open('smartphone.json') as file: smartphone_dict = json.load(file) print(type(smartphone_dict)) # features = smartphone_dict['features'] # ['5G', 'HD display', 'Dual camera']

Встроенная библиотека open() позволяет загрузить файл и получить соответствующий ему объект файла. Затем метод json.read() десериализует текстовый или двоичный файл, содержащий документ JSON, в эквивалентный объект Python. В данном случае smartphone.json становится словарем Python.

Идеально, парсинг файла JSON в Python занимает всего несколько строк кода!

Из данных JSON в пользовательский объект Python

Теперь вы хотите спарсить некоторые данные JSON в пользовательском классе Python. Вот как выглядит ваш кастомный класс Smartphone в Python:

class Smartphone: def __init__(self, name, colors, price, in_stock): self.name = name self.colors = colors self.price = price self.in_stock = in_stock

Здесь задача состоит в том, чтобы преобразовать следующую строку JSON в экземпляр smartphone :

Чтобы выполнить эту задачу, необходимо создать пользовательский декодер. Для этого необходимо расширить класс JSONDecoder и установить параметр object_hook в методе __init__ . Присвойте ему имя метода класса, содержащего кастомную логику парсинга. В этом методе вы можете использовать значения, содержащиеся в стандартном словаре, возвращаемые json.read() для инстанцирования объекта Smartphone .

Определите пользовательский SmartphoneDecoder , как показано ниже:

import json class SmartphoneDecoder(json.JSONDecoder): def __init__(self, object_hook=None, *args, **kwargs): # set the custom object_hook method super().__init__(object_hook=self.object_hook, *args, **kwargs) # class method containing the # custom parsing logic def object_hook(self, json_dict): new_smartphone = Smartphone( json_dict.get('name'), json_dict.get('colors'), json_dict.get('price'), json_dict.get('inStock'), ) return new_smartphone

Обратите внимание, что для чтения значений словаря в пользовательском методе object_hook() следует использовать метод get() . Это обеспечит отсутствие ошибок KeyErrors , если ключ отсутствует в словаре. В этом случае будет просто возвращено значение None .

Теперь вы можете передать класс SmartphoneDecoder в параметр cls в json.loads() для преобразования строки JSON в объект Smartphone :

import json # class Smartphone: # . # class SmartphoneDecoder(json.JSONDecoder): # . smartphone_json = '' smartphone = json.loads(smartphone_json, cls=SmartphoneDecoder) print(type(smartphone)) # name = smartphone.name # iPear 23 Plus

Аналогично можно использовать SmartphoneDecoder с json.load() :

smartphone = json.load(smartphone_json_file, cls=SmartphoneDecoder)

Вуаля! Теперь вы знаете, как парсить данные JSON в пользовательские объекты Python!

Данные Python в JSON

Вы также можете пойти обратным путем и преобразовать структуры данных и примитивы Python в JSON. Это возможно благодаря функциям json.dump() и json.dumps(), в соответствии с приведенной ниже таблицей преобразований:

Данные Python JSON-значение
str string
int number (integer)
float number (real)
True true
False false
None null
list array
dict object
Null None

json.dump() позволяет записать строку JSON в файл, как показано в следующем примере:

import json user_dict = < "name": "John", "surname": "Williams", "age": 48, "city": "New York" ># serializing the sample dictionary to a JSON file with open("user.json", "w") as json_file: json.dump(user_dict, json_file)

Этот фрагмент сериализует переменную Python user_dict в файл user.json .

Аналогично, json.dumps() преобразует переменную Python в эквивалентную ей строку JSON:

import json user_dict = < "name": "John", "surname": "Williams", "age": 48, "city": "New York" >user_json_string = json.dumps(user_dict) print(user_json_string)

Запустите этот сниппет и вы получите:

Это именно JSON-представление словаря Python.

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

Является ли стандартный модуль json лучшим ресурсом для парсинга JSON в Python?

Как и в случае с парсингом данных в целом, парсинг JSON сопряжен с проблемами, которые нельзя игнорировать. Например, в случае недействительного, неполного или нестандартного JSON модуль Python json не справится с задачей.

Также необходимо быть осторожным при парсинге данных JSON из ненадежных источников. Это связано с тем, что вредоносная строка JSON может привести к поломке парсера или потреблению большого количества ресурсов. Это лишь некоторые из проблем, которые должен учитывать парсер Python JSON.

Вы можете ввести пользовательскую логику для решения этих конкретных случаев. В то же время, это может занять слишком много времени и привести к сложному и ненадежному коду. По этой причине вам следует рассмотреть коммерческий инструмент, облегчающий разбор JSON, например, Web Scraper IDE.

Web Scraping IDE создана специально для разработчиков и обладает широким набором функций для парсинга JSON-контента и не только. Этот инструмент сэкономит вам массу времени и поможет обезопасить процесс разбора JSON. Кроме того, он поставляется с прокси Bright Data для анонимного вызова JSON API в случае наличия гео-ограничений.

Если вы спешите, вас также может заинтересовать наше предложение «Данные как услуга». С помощью этого сервиса вы можете попросить Bright Data предоставить вам индивидуальный набор данных, который соответствует вашим конкретным потребностям. Bright Data позаботится обо всем, от производительности до качества данных.

Парсинг данных JSON еще никогда не был таким простым!

Заключение

Python позволяет вам анализировать данные JSON с помощью стандартного модуля json . Он предоставляет мощный API для сериализации и десериализации содержимого JSON. В частности, он предлагает методы json.read() и json.reads() для работы с файлами JSON и строками JSON соответственно. Здесь вы увидели, как использовать их для парсинга данных JSON в Python на нескольких реальных примерах. В то же время, вы также поняли ограничения этого подхода. Именно поэтому вы, возможно, захотите попробовать такое передовое и полнофункциональное коммерческое решение для парсинга данных, как Web Scraper IDE от Bright Data.

10 примеров для изучения модуля JSON в Python

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

JSON можно рассматривать как коллекцию пар ключ-значение, как и словарь в Python.

Вот простой файл JSON:

Приведенный выше код — наглядный пример того, что JSON является человекочитаемым: вы можете прочитать JSON-файл и понять, какие данные он содержит. Он также легко парсится и генерируется машинами.

Почему JSON так популярен?

Широкому использованию JSON в разработке программного обеспечения и программировании способствуют многочисленные факторы. Перечислим некоторые из них.

  • Удобство чтения. Как видно из приведенного выше примера, JSON легко читать и писать, что делает его отличным выбором для хранения данных, которые нужно сделать человекочитаемыми.
  • Легкость. JSON не очень многословен, что облегчает его передачу по сети, а также ускоряет парсинг и загрузку.
  • Структура. Это структурированный формат для хранения данных, легко читаемый людьми и машинами.
  • Интероперабельность. JSON не зависит от языка и может быть использован в любом языке, а не только в JavaScript. Поэтому он отлично подходит для обмена данными между различными языками программирования.

Работа с JSON в Python

Встроенный в Python модуль json обеспечивает простой и эффективный способ работы с форматом JSON. Рассмотрим 10 примеров, демонстрирующих общие задачи, которые можно выполнять с помощью этого модуля.

Пример 1. Преобразование объекта Python в строку JSON

import json

data = "name": "John Doe",
"age": 28,
"city": "Houston"
>

json_data = json.dumps(data)
print(json_data)

# вывод

Метод dumps преобразует словарь в строку в формате json. Поэтому приведенный выше тип переменной json_data становится строкой.

type(json_data)

# вывод
str

Пример 2. Красивый вывод JSON

import json

data = "name": "John Doe",
"age": 28,
"city": "Houston"
>

json_data = json.dumps(data, indent=4)
print(json_data)

# вывод
"name": "John Doe",
"age": 28,
"city": "Houston"
>

Использование параметра indent позволяет сделать файл более читабельным.

Пример 3. Сортировка ключей

import json

data = "name": "John Doe",
"age": 28,
"city": "Houston"
>

json_data = json.dumps(data, sort_keys=True, indent=4)
print(json_data)

# вывод
"age": 28,
"city": "Houston",
"name": "John Doe"
>

Напомним, что файл JSON представляет собой набор пар ключ-значение. Вы можете сортировать эти пары по ключам с помощью параметра sort_keys .

Пример 4. Загрузка JSON в объект Python

import json

json_data = ''
data = json.loads(json_data)

print(data)
print(data['name']) # Доступ к значению ключа 'name'

# вывод

John Doe

Возьмем файл JSON, сохраненный в виде строки. Преобразуем его в объект Python типа dictionary с помощью функции loads . Проверим тип этого файла.

type(data)

# вывод
dict

Пример 5. Запись контента Python в JSON-файл

import json

data = "name": "John Doe",
"age": 28,
"city": "Houston"
>

with open('data.json', 'w') as file:
json.dump(data, file)

В этом примере у нас есть словарь Python под названием data . Используем метод dump для записи его контента в файл JSON с именем data.json , который выглядит следующим образом:

Пример 6. Передача данных из файла JSON

import json

with open('data.json', 'r') as file:
data = json.load(file)

print(data)

# вывод

Метод load позволяет передать контент файла JSON в словарь Python.

Пример 7. Параметр default

Параметр default функции dumps можно использовать для сериализации сложных объектов Python, которые иначе не могут быть сериализованы. Например, следующий код вызывает ошибку TypeError из-за объекта datetime :

import json

data = "name": "John Doe",
"age": 28,
"city": "Houston",
"birthday": datetime.datetime.now()
>

json_data = json.dumps(data, indent=4)

# вывод
TypeError: Object of type datetime is not JSON serializable

Чтобы избежать этой ошибки, следует написать пользовательскую функцию, которая указывает функции dumps , как сериализовать этот объект:

import json
import datetime

def datetime_serializer(x):
if isinstance(x, datetime.datetime):
return x.isoformat()

data = "name": "John Doe",
"age": 28,
"city": "Houston",
"birthday": datetime.datetime.now()
>

json_data = json.dumps(data, indent=4, default=datetime_serializer)
print(json_data)

# вывод
"name": "John Doe",
"age": 28,
"city": "Houston",
"birthday": "2023-05-14T07:22:53.917531"
>

Пример 8. Параметр default и пользовательский класс

Допустим, есть пользовательский класс Person , и его нужно преобразовать экземпляр в JSON.

class Person: 
def __init__(self, name, age):
self.name = name
self.age = age

person = Person("John", 30)
json.dumps(person) # Вызывает TypeError

# вывод
ypeError: Object of type Person is not JSON serializable

Можно определить функцию, указывающую, как сериализовать объект Person:

class Person: 
def __init__(self, name, age):
self.name = name
self.age = age

def person_to_dict(person):
return

person = Person("John", 30)
json.dumps(person, default=person_to_dict)

# вывод
''

Пример 9. JSONEncoder

Класс JSONEncoder предоставляет больше контроля над процессом сериализации при преобразовании сложного объекта Python в JSON. Вместо того чтобы использовать функцию default , для json.dumps() можно создать подкласс JSONEncoder и переопределить его метод default() .

Возьмем тот же пример с классом Person , но используем JSONEncoder вместо параметра default .

import json

class Person:
def __init__(self, name, age):
self.name = name
self.age = age

class PersonEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, Person):
return
return super().default(o)

person = Person("John", 30)
json.dumps(person, cls=PersonEncoder)

# вывод
''

PersonEncoder является подклассом, который наследуется от JSONEncoder .

Пример 10. Параметр skipkeys

Параметр skipkeys в dumps используется для указания того, что следует пропускать ключи, не относящиеся к основным типам ( str , int , float , bool , None ), вместо того, чтобы выдавать ошибку TypeError . Это удобно при работе с большими файлами.

Рассмотрим пример с использованием кортежа в качестве ключа:

import json

data = (1, 2): "tuple_key",
"normal_key": "value"
>

print(json.dumps(data))

# вывод
TypeError: keys must be str, int, float, bool or None, not tuple

Как видно из вывода, возникает ошибка TypeError . Если установить значение параметра skipkeys равным True , ключ кортежа будет пропущен без возникновения ошибки.

import json

data = (1,2): "tuple_key", # кортежи как ключи являются не JSON-сериализуемыми
"normal_key": "value"
>
print(json.dumps(data, skipkeys=True))

# вывод

Заключение

Мы познакомились с модулем json, который является мощным инструментом языка Python для работы с данными JSON. Он предоставляет функции и методы с высокой степенью гибкости и контроля над процессом сериализации и десериализации.

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

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

  • JSON и Python: есть контакт!
  • Прекратите использовать конфигурационные файлы JSON
  • Подробный обзор JSON, JSON5 и циклических зависимостей

Читайте нас в Telegram, VK и Дзен

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *