Работа с данными json в Python
Во время написания кода, часто становится необходимо записывать какие-либо данные на жесткий диск. В этом нам может помочь модуль json, который уже вшит в пайтон. Давайте же разберемся как он работает.
Модуль json
Javascript Object Notation, как понятно из названия, написание на Js и является очень простым форматом для обмена данными. Для того, чтобы импортировать его в проект достаточно прописать «import json».
С помощью этого модуля можно очень легко и просто записать объекты пайтон в файл с расширением json, а потом, при запуске программы, эти данные можно прочитать.
Записать что-то в json файл означает сериализовать, а из json файла в пайтон — десериализовать. Теперь разберемся со всем более подробно.
Конвертация из json в python
Для сериализации существует два метода: dump(), который записывает данные в файл, dumps(), который записывает данные в пайтон строку.
Пример сериализации json python
import json
dict = {
«name»: «Oleg»,
«age»: 25,
«city»: «Moskva»
}
serial = json.dumps(dict)
print(serial ) => {«name»: «Oleg», «age»: 25, «city»: «Moskva»}
Тут все довольно просто: на 2 строчке кода создаем словарь, в который записываем данные, которые хотим сохранить. На 7-ой же строчке мы записываем эти данные в строку пайтон. Для того, чтобы записать данные в файл, необходимо сделать следующее:
with open(«output.json», «w») as for_write:
json.dump(dict , for_write)
Вместо седьмой и восьмой строчки кода, нужно прописать этот код. Тут мы сначала открываем файл для записи, а потом все, что находится в словаре записываем в файл.
Стоит обратиться внимание на то, что по умолчанию json не может работать с кириллицей, и чтобы его «научить» нужно указать параметр «ensure_ascii=False»
first = {«lastname»: «Пушкин»}
second = {«subject»: «Математика»}
print(json.dumps(first))
print(json.dumps(second, ensure_ascii=False))
Конвертировать из python в json
Модуль json дает нам возможность читать данные из файла и записывать их в объекты пайтона.
for_json = «»»
{
«researcher»: {
«name»: «Ford Prefect»,
«species»: «Betelgeusian»,
«relatives»: [
{
«name»: «Zaphod Beeblebrox»,
«species»: «Betelgeusian»
}
]
}
}
«»»
string1 = json.loads(for_json )
Кодирование и декодирование объектов
Теперь давайте разберем сериализацию и десериализацию сложных объектов. Например:
class Person:
def __init__(self, name, age):
self.name = name
self.age= 25
При сериализации данного объекта мы получим ошибку, ибо json не может обрабатывать пользовательские объекты по умолчанию. Надо ему в этом помочь, немного упростив свой объект.
one = Person(«course1», 80)
two = Person(«course2», 90)
list_of_Person= [one, two ]
Самой простой способ — представить объект в словаре.
Human = [{‘name’: x.name, ‘age’: x.age} for x in list_of_Person]
with open(‘output.json’, ‘w’) as out:
json.dump(Human , out)
А для того, чтобы потом прочитать можно использовать следующий код:
with open(‘output.json’) as inp:
data = json.load(inp)
list_of_Person= [Test(x[‘name’], x[‘age’]) for x in data]
Пример работы с json python
Теперь давайте глянем на работу с json в реальной жизни и на более-менее реальной задаче. Импортируем для начала 2 библиотеки: json и requests. Вторая нам нужна для того, чтобы делать запросы API в сервис JSONPlaceholder, который предоставляет нам фейковые данные JSON.
answer = requests.get(«https://jsonplaceholder.typicode.com/todos»)
todos = json.loads(answer .text)
person_todo = {} # Число выполненных задач соотносится с идентификатором пользователя.
for item in todos:
if item[«completed»]:
try: # кол-во пользователей увеличивается
person_todo[item[«userId»]] += 1
except: # ставим кол-во 1 каждому новому пользователю
person_todo[item «userId»]] = 1
top_person = sorted(person_todo.items(),
key=lambda x: x[1], reverse=True) # Отсортированный список пар
done_max = top_person[0][1]
persons = [] # список для тех, кто выполнил максимальное кол-во задач
for person, done in top_person:
if done < done_max:
break
persons.append(str(person))
max_persons = » and «.join(persons)
В качестве небольшой разминки и практики для вас не стану подробно делать описание кода. Там добавлены все необходимые комментарии, по которым не трудно догадаться, что он делает! Удачи!
Тест на знание python
Надеюсь, вы справились с предыдущим заданием, и теперь готовы пройти небольшой тестик, который поможет вам лучше закрепить сегодняшний материал.
- Что такое json и для чего нужен?
- Что такое сериализация и десериализация данных?
- Может ли json по умолчанию работать с кириллицей?
- В чем разница между «dump» и «dumps», а также «load» и «loads»?
- Расскажите про «Кодирование пользовательских типов».
Теперь вы познакомились с сериализацией и десериализацией объектов с помощью json. Самое время закрепить свои знания на практике. Поэтому прямо сейчас реализуйте небольшое приложение, используя библиотеку json! Удачи!