Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Современные средства разработки программного обеспечения. Учебное пособие
.pdf
161
предприятия, системы управления взаимоотношениями с клиентами (CRM) или системы обработки платежей [44].
Выделяют следующие методы системной интеграции.
– Вертикальная интеграция.
– Интеграция «точка-точка».
– Горизонтальная интеграция.
– Звездообразной интеграции.
– Интеграция с общим форматом данных (CDF).
Интеграция с общим форматом данных (CDF) — это стандартизированный метод интеграции, который позволяет различным системам использовать общий формат
данных. Такой подход способствует простому обмену данными между системами,
независимо от их уникальной структуры данных [44].
Команды могут начать с определения требований к интеграции и определения
того, какие данные будут совместно использоваться между системами. Затем им
необходимо разработать CDF, который определяет стандартный формат для необходимых полей данных.
После создания CDF команда может использовать процессы ETL (извлечение,
преобразование, загрузка) или платформы промежуточного ПО для сопоставления
данных со стандартным форматом CDF. Группа также должна убедиться, что каждое
программное приложение может читать стандартный формат, настроив параметры
приложений.
11.4 Работа с Json в Python
JSON или JavaScript'S Object N – это текстовый формат для структурирования
данных, полностью не зависит от языка.
Такой формат данных используется приложениями для взаимодействия друг с
другом. JSON сериализует данные и преобразует их в удобочитаемый и понятный
формат, что также делает их доступными для передачи и обмена данными.
Python поддерживает JSON через встроенный пакет под названием JSON.

162
Правила синтаксиса JSON
Синтаксис JSON является производным от синтаксиса объектной нотации
JavaScript:
Данные представлены в парах имя : значение.
Пример.
{ "name":"Misha" }
JSON поддерживает в основном 6 типов данных:
− array – ассоциативный массив значений.
− boolean – логическое значение: True или false.
− number – целое число.
− object – объект: ассоциативный массив пар ключ/значение.
− string – строка: несколько символов обычного текста, которые обычно об-
разуют слово.
− null – пустое значение
Примечание: string, number, boolean, null являются простыми типами данных
или примитивными типами данных, тогда как object и array относятся к сложным
типам данных.
Пример хранения нескольких объектов:
person={"name":" Alyosha Popovich", "Occupation":"Homeland’s de-
fenders"}
Пример использования значения – массива:
person={"name":" Alyosha Popovich", "occupation":"Homeland’s de-
fenders", "abilities": ["power", "savvy", "dexterity"] }
Пример. Текст в формате JSON.
{
"Avens": [
{
"name": "Alyosha Popovich",
"occupation": "Homeland’s defenders",
"abilities": ["power", "savvy", "dexterity"]
},
{
"name": "Serpent Gorynych",
"occupation": "fiend",

163
"abilities": ["power", "flies", "throwing
fire"]
},
]
}
Сериализация JSON
Процесс кодирования JSON обычно называется сериализацией. Этот термин
относится к преобразованию данных в последовательность байтов для хранения или
передачи по сети. Чтобы обрабатывать поток данных в файле, библиотека JSON в
Python использует функцию dump() для преобразования объектов Python в соответствующие им объекты JSON, что упрощает запись данных в файлы.
В таблице 11.2 приведено соответствие типов данных в Python и в Json.
Таблица 11.2 – Соответствие типов данных в Python и в Json
Таблица конвертации данных Python
в JSON
Таблица конвертации JSON в дан-
ные Python
Python
JSON
JSON
Python
dict
object
object
dict
list, tuple
array
array
list
str
string
string
str
int, long, float
number(int, real)
number(int, real)
int, float
True, False
true, false
true, false
True, False
None
null
null
None
Способ 1: запись JSON в файл на Python с помощью json.dump()
Метод json.dump() пакета json напрямую записывает словарь в файл в формате
JSON без необходимости преобразовывать его в реальный объект JSON. Для этого
требуется 2 параметра:
- dictionary – имя словаря, который должен быть преобразован в объект JSON.
- указатель на файл – указатель на файл, открытый в режиме записи или до-
бавления.
Пример. Сериализация методом json.dump()

164
import json
dict1 = {
"Subjects": {
"Maths":85,
"Physics":90
}
}
with open("Example.json", "w") as p:
json.dump(dict1, p)
В программе сначала создается словарь dict1.
Затем, создается файл с именем Example.json и открывается в режиме записи.
Далее функция dump() сериализует словарь, принимая два аргумента: во-первых, объект данных, подлежащий сериализации, и, во-вторых, объект, в который
они будут записаны (формат байт).
Пример. Cериализация методом json.dump() c учетом кодировки символов.
#import json
data = {"id":765, "email":"ivanov@mail.ru", "surname":"Иванов",
"age":45, "admin":False, "friends":[123,456,789]}
# преобразуем словарь в json-строку
string = json.dumps(data)
print(string)
# преобразуем словарь в json-строку с учетом кодировки
string = json.dumps(data, ensure_ascii = False)
print(string)
Результат:
{"id": 765, "email": "ivanov@mail.ru", "surname":
"\u0418\u0432\u0430\u043d\u043e\u0432", "age": 45, "admin":
false, "friends": [123, 456, 789]}
{"id": 765, "email": "ivanov@mail.ru", "surname": "Иванов",
"age": 45, "admin": false, "friends": [123, 456, 789]}
Способ 2. Запись JSON в файл на Python с использованием json.dumps()
Пакет JSON на Python имеет функцию json.dumps(), которая преобразует словарь в объект JSON.

165
Функция принимает два параметра:
- dictionary – имя словаря, который должен быть преобразован в объект JSON.
- indent (отступ) – определяет количество единиц для отступа
После преобразования словаря в объект JSON нужно просто записать его в
файл, используя функцию outfile.write().
Пример. Сериализация методом json.dumps()
import json
dictionary = {
"name": "sasha",
"rollno": 59,
"cgpa": 8.9,
"phonenumber": "8976771523"
}
json_object = json.dumps(dictionary, indent=4)
# Writing to sample.json
with open("sample.json", "w") as outfile:
outfile.write(json_object)
Десериализация JSON
Десериализация противоположна сериализации, то есть преобразованию объектов JSON в соответствующие им объекты Python.
Для этого используется метод load().
Если получены данные JSON из другой программы в виде строки формата
JSON, то их можно легко десериализовать с помощью json.load(), которая загружает
содержимое JSON из файла JSON в словарь.
with open("Sample.json", "r", encoding = 'UTF-8') as read_it:
data = json.load(read_it)
Пример. Десериализация из строки
json_var ="""
{
"Country": {

166
"name": "INDIA",
"Languages_spoken": [
{
"names": ["Hindi", "English", "Bengali",
"Telugu"]
}
]
}
}
"""
var = json.loads(json_var)
Кодирование и декодирование пользовательских объектов
Следует помнить, что объект JSON, создаваемый во время сериализации,
представляет собой Python строку, т.е. при сериализации термины «объект JSON» и
«строка JSON» взаимозаменяемыми.
Также важно отметить, что объект JSON соответствует словарю в Python. Поэтому, при использовании метода загрузки по умолчанию возвращается, словарь
Python, если не изменить это поведение.
import json
py_object = {"a": "а", "b": "б", "c": "в", "d":"д"}
# Encoding
json_string = json.dumps(py_object)
print(json_string)
print(type(json_string))
# Decoding JSON
py_obj = json.loads(json_string)
print(py_obj)
print(type(py_obj))
Результат:
{"a": "\u0430", "b": "\u0431", "c": "\u0432", "d": "\u0434"}
<class 'str'>
{'a': 'а', 'b': 'б', 'c': 'в', 'd': 'д'}

167
<class 'dict'>
В случае с пользовательскими объектами приведенный выше код не будет работать, и будет получена примерно такая ошибка:
TypeError: Object of type Student is not JSON serializable
Пример.
import json
class Student:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
class Address:
def __init__(self, city, street):
self.city = city
self.street = street
addr = Address("Oren", "8 Marсh")
student = Student("Ivanow", 20, addr)
# Encoding
student_json=json.dumps(student)
На выходе ошибка вида:
TypeError: Object of type Student is not JSON serializable
Для сериализации пользовательских типов можно использовать один из следующих способов.
Способ 1.
Самый простой способ сделать это – определить в классе метод, который будет предоставлять JSON-версию экземпляра нашего класса.
Пример.
Например, нужно сделать пользовательский класс Student сериализуемым в
формате JSON.
import json
class Student:
def __init__(self, name, age, address):

168
self.name = name
self.age = age
self.address = address
def to_json(self):
return json.dumps(self, indent = 4, default=lambda
o: o.__dict__)
class Address:
def __init__(self, city, street):
self.city = city
self.street = street
addr = Address("Oren", "8 Marсh")
student = Student("Ivanow", 20, addr)
# Encoding 1
student_json = student.to_json()
print(student_json)
print(type(student_json))
# Decoding 1
student1 = json.loads(student_json)
print(student1)
print(type(student1))
Результат:
{
"name": "Ivanow",
"age": 20,
"address": {
"city": "Oren",
"street": "8 Mar\u0441h"
}
}
<class 'str'>
{'name': 'Ivanow', 'age': 20, 'address': {'city': 'Oren',
'street': '8 Marсh'}}
<class 'dict'>

169
Способ 2.
Cоздать новый класс, который расширит JSONEncoder, а затем использовать
этот класс в качестве аргумента метода dumps().
Пример.
import json
import json
from json import JSONEncoder
class Student:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
def to_json(self):
return json.dumps(self, indent = 4, default=lambda
o: o.__dict__)
class Address:
def __init__(self, city, street):
self.city = city
self.street = street
class EncodeStudent(JSONEncoder):
def default(self, o):
return o.__dict__
addr = Address("Oren", "8 March")
student = Student("Ivanow", 20, addr)
# using cls(class) argument of dumps method
student_JSON = json.dumps(student, indent = 4,
cls = EncodeStudent)
print(student_JSON)
print(type(student_JSON))
# Decoding
student = json.loads(student_JSON)
print(student)
print(type(student))
Результат:

170
{
"name": "Ivanow",
"age": 20,
"address": {
"city": "Oren",
"street": "8 March"
}
}
<class 'str'>
{'name': 'Ivanow', 'age': 20, 'address': {'city': 'Oren',
'street': '8 March'}}
<class 'dict'>
Способ 3.
Использование параметра object_hook метода загрузки позволит преобразовать JSON в какой-либо другой объект Python (т. е. не в словарь по умолчанию).
Для этого нужно определять метод, реализующий нужный способ обработки
данных и передать его в качестве аргумента object_hook в метод загрузки loads().
Тогда, возвращаемым типом метода загрузки будет тип возвращаемого значения метода, передаваемого как параметр object_hook.
Пример. В этом примере типом возвращаемого значения будет комплексное
число.
import json
def as_complex(dct):
if '__complex__' in dct:
return complex(dct['real'], dct['imag'])
return dct
res = json.loads('{"__complex__": true, "real": 1, "imag":
2}',
object_hook = as_complex)
print(res)
print(type(res))
Результат:
(1+2j)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
