Разное

Json python load: 18.2. json — JSON encoder and decoder — Python 2.7.18 documentation

Содержание

Модуль json в Python. | DOCS-Python.ru

Чтение и парсинг json формата, запись данных в файл.

JavaScript Object Notation (JSON) — это независимый от языка формат обмена данными, представленный в текстовом виде и понятный человеку. Он был получен из стандарта языка программирования ECMAScript. Формат JSON определяет маленький набор правил форматирования для переносимого представления структурированных данных.

Информация в формате JSON может быть представлена в двух видах:

  • Последовательность пар с ключами и соответствующими им значениями, подобно словарям;
  • Просто упорядоченный набор значений, подобно спискам.

Модуль json предоставляет API, подобный стандартным библиотечным модулям piclike.

Примечания:

  • JSON — это подмножество YAML 1.2. Объект JSON, создаваемый с значением разделителей по умолчанию, также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль также можно использовать в качестве сериализатора YAML.
  • Сериализатор и десериализатор этого модуля по умолчанию сохраняют порядок ввода и вывода элементов. Порядок теряется только в том случае, если вложенные контейнеры неупорядочены.

Стандартное соответствие и совместимость:

Этот модуль НЕ строго соответствует RFC, реализуя некоторые расширения, которые являются допустимым JavaScript, но не допустимым JSON.

  • Бесконечные и NaN числовые значения принимаются и выводятся;
  • Повторные имена внутри объекта принимаются и используется только значение последней пары name:value.

Поскольку RFC позволяет RFC-совместимым синтаксическим анализаторам принимать входные тексты, не соответствующие RFC, десериализатор этого модуля технически RFC-совместим при настройках по умолчанию.

Бесконечные числовые значения и NaN:

RFC не допускает представление бесконечных или числовых значений NaN. Несмотря на это, по умолчанию этот модуль принимает и выводит Infinity, -Infinity и NaN, как если бы они были действительными значениями литералов числа JSON:

# Ни один из этих вызовов не вызывает исключение, 
# но результаты не являются допустимыми JSON
>>> import json
>>> json.dumps(float('-inf'))
# '-Infinity'
>>> json.dumps(float('nan'))
# 'NaN'
>>> # Same when deserializing
>>> json.loads('-Infinity')
# -inf
>>> json.loads('NaN')
# nan
  • В сериализаторе параметр allow_nan может использоваться для изменения этого поведения.
  • В десериализаторе параметр parse_constant может использоваться для изменения этого поведения.

Повторяющиеся имена внутри объекта:

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

>>> import json
>>> weird_json = '{"x": 1, "x": 2, "x": 3}'
>>> json.loads(weird_json)
{'x': 3}

Параметр object_pairs_hook можно использовать для изменения этого поведения.

Кодировки символов:

RFC требует, чтобы JSON был представлен с использованием UTF-8, UTF-16 или UTF-32, при этом UTF-8 является рекомендуемым значением по умолчанию для максимальной совместимости.

В соответствии с разрешением, хотя и не обязательным для RFC, сериализатор этого модуля по умолчанию задает значение sure_ascii=True, таким образом экранируя выходные данные, поэтому результирующие строки содержат только символы ASCII.

Помимо параметра sure_ascii, этот модуль определен строго с точки зрения преобразования между объектами Python и строками Unicode, в противном случае напрямую не решает проблему кодировки символов.

RFC запрещает добавлять метку порядка байтов (BOM) в начало текста JSON, сериализатор этого модуля не добавляет BOM в свой вывод. RFC разрешает, но не требует от десериализаторов JSON игнорировать начальную спецификацию в своих входных данных. Десериализатор модуля json вызывает ошибку ValueError, когда присутствует начальная спецификация.

RFC явно не запрещает строки JSON, которые содержат последовательности байтов, которые не соответствуют действительным символам Unicode, например непарные суррогаты UTF-16, но отмечает, что они могут вызывать проблемы взаимодействия. По умолчанию этот модуль принимает и выводит, если присутствует в исходной строке, кодовые точки для таких последовательностей.

Как работать с данными JSON с помощью Python

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

Прежде чем я начну тему, давайте кратко определим, что мы подразумеваем под JSON . Давайте посмотрим, как это определяет главный сайт JSON:

JSON (JavaScript Object Notation) — это легкий формат обмена данными. Людям легко читать и писать. Машины легко разбираются и генерируются. Он основан на подмножестве языка программирования JavaScript , стандарт ECMA-262, 3-е издание, декабрь 1999 года . JSON — это текстовый формат, полностью независимый от языка, но использующий соглашения, знакомые программистам языков семейства C, включая C, C ++, C #, Java, JavaScript, Perl, Python и многие другие. Эти свойства делают JSON идеальным языком обмена данными.

Таким образом, JSON — это простой способ создания и хранения структур данных в JavaScript. Причина, по которой вы видите JavaScript в аббревиатуре, связана с тем, что при хранении данных в JSON создается объект JavaScript. Но, не волнуйтесь, вам не нужно знать JavaScript для работы с файлами JSON, скорее речь идет о самом синтаксисе (формате) JSON.

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

Пример данных в формате JSON:

1

2

{«name»: «Frank», «age»: 39,

«isEmployed»: true}

В этом уроке я покажу вам, как использовать Python для работы с файлами JSON. Итак, начнем!

Python и JSON

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

import json

Но что делает библиотека json ? Эта библиотека в основном анализирует JSON из файлов или строк. Он также анализирует JSON в словарь или список в Python и наоборот, то есть преобразует словарь или список Python в строки JSON.

JSON в Python

Чтение JSON означает преобразование JSON в значение (объект) Python. Как упоминалось выше, библиотека json анализирует JSON в словарь или список в Python. Для этого мы используем функцию load loads() (загрузка из строки) следующим образом:

1

2

3

import json

jsonData = ‘{«name»: «Frank», «age»: 39}’

jsonToPython = json.loads(jsonData)

Если вы хотите увидеть вывод, выполните print jsonToPython , и в этом случае вы получите следующий вывод:

{u'age': 39, u'name': u'Frank'}

То есть данные возвращаются как словарь Python (структура данных объекта JSON). Итак, будет ли оператор print jsonToPython['name'] возвращать какой-либо вывод? Давай, попробуй.

Python в JSON

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

Скажем, у нас есть следующий словарь в Python:

1

2

3

import json

pythonDictionary = {‘name’:’Bob’, ‘age’:44, ‘isEmployed’:True}

dictionaryToJson = json.dumps(pythonDictionary)

Если мы print dictionaryToJson , мы получим следующие данные JSON:

{"age": 44, "isEmployed": true, "name": "Bob"}

Таким образом, этот вывод считается представлением данных объекта (словарь). Метод dumps() был ключом к такой операции.

На этом этапе важно отметить, что JSON не может хранить все типы объектов Python, а только следующие типы: Lists; Словари; Булевы; Числа; Символьные строки; и нет. Таким образом, любые другие типы должны быть преобразованы для хранения в JSON.

Допустим, у нас есть следующий класс :

1

2

3

class Employee(object):

   def __init__(self, name):

       self.name = name

Допустим, мы создали новый объект abder следующим образом:

abder = Employee('Abder')

Что если мы хотим преобразовать этот объект в JSON? Это json.dumps(abder) ? В этом случае вы получите ошибку, подобную следующей:

01

02

03

04

05

06

07

08

09

10

11

12

Traceback (most recent call last):

  File «test.py», line 8, in <module>

    abderJson = json.dumps(abder)

  File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py», line 243, in dumps

    return _default_encoder.encode(obj)

  File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py», line 207, in encode

    chunks = self.iterencode(o, _one_shot=True)

  File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py», line 270, in iterencode

    return _iterencode(o, 0)

  File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py», line 184, in default

    raise TypeError(repr(o) + » is not JSON serializable»)

TypeError: <__main__.Employee object at 0x10e74b750> is not JSON serializable

Но есть ли обходной путь? К счастью, есть. Мне нравится обходной путь, описанный на сайте Python Tips . Чтобы решить эту проблему, мы можем определить метод, подобный следующему:

1

2

def jsonDefault(object):

   return object.__dict__

Затем закодируйте объект в JSON следующим образом:

jsonAbder = json.dumps(abder, default=jsonDefault)

Если вы print jsonAbder , вы должны получить следующий вывод:

{"name": "Abder"}

Теперь мы закодировали объект Python ( abder ) в JSON.

Вывод

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

Если вы хотите узнать больше о модуле json , вы можете посетить страницу документации .

Изучите JavaScript: полное руководство

Мы создали полное руководство, которое поможет вам изучить JavaScript , независимо от того, начинаете ли вы как веб-разработчик или хотите изучать более сложные темы.

Выучить питон

Изучите Python с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.

54) Python JSON — CoderLessons.com

Что такое JSON?

JSON — это стандартный формат для обмена данными, основанный на JavaScript. Как правило, JSON находится в строковом или текстовом формате. JSON обозначает J AVA S cript O ▪ Таблица N otation.

Синтаксис JSON: JSON записывается как пара ключ-значение.

{
        "Key":  "Value",
        "Key":  "Value",
} 

JSON очень похож на словарь Python. Python поддерживает JSON и имеет встроенную библиотеку в виде JSON.

Библиотека JSON на Python

Внешние модули Python ‘ marshal ‘ и ‘ pickle’ поддерживают версию библиотеки JSON . Для выполнения операций, связанных с JSON, таких как кодирование и декодирование в Python, сначала необходимо импортировать библиотеку JSON, а для этого — в свой файл .py ,

import json

Следующие методы доступны в модуле JSON

метод Описание
свалки () кодирование в объекты JSON
дамп () запись кодированной строки в файл
нагрузки () Декодировать строку JSON
нагрузка () Декодировать при чтении файла JSON

Python в JSON (кодировка)

JSON Library of Python по умолчанию выполняет следующий перевод объектов Python в объекты JSON

питон JSON
ДИКТ объект
список массив
юникода строка
число — int, long число — int
поплавок число — реальное
Правда Правда
Ложь Ложь
Никто Значение NULL

Преобразование данных Python в JSON называется операцией кодирования. Кодирование выполняется с помощью метода библиотеки JSON — dumps ().

Метод dumps () преобразует объект словаря python в формат строковых данных JSON.

Теперь давайте выполним наш первый пример кодирования на Python.

import json

x = {
  "name": "Ken",
  "age": 45,
  "married": True,
  "children": ("Alice","Bob"),
  "pets": ['Dog'],
  "cars": [
    {"model": "Audi A1", "mpg": 15.1},
    {"model": "Zeep Compass", "mpg": 18.1}
  ]
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Вывод:

{"person": {"name": "Kenn", "sex": "male", "age": 28}})

Давайте создадим JSON-файл словаря, используя ту же функцию dump ()

# here we create new data_file.json file with write mode using file i/o operation 
with open('json_file.json', "w") as file_write:
# write json data into file
json.dump(person_data, file_write)

Вывод:

Нечего показать … В вашей системе создан файл json_file.json, вы можете проверить этот файл.

JSON в Python (декодирование)

JSON строка декодирования выполняется с помощью встроенных методов нагрузок () и нагрузки () библиотеки JSON в Python. Здесь таблица перевода показывает пример объектов JSON в объекты Python, которые полезны для выполнения декодирования в Python строки JSON.

JSON питон
объект ДИКТ
массив список
строка юникода
число — int число — int, long
число — реальное поплавок
Правда Правда
Ложь Ложь
Значение NULL Никто

Давайте рассмотрим базовый пример декодирования в Python с помощью функции json.loads () ,

import json  # json library imported
# json data string
person_data = '{  "person":  { "name":  "Kenn",  "sex":  "male",  "age":  28}}'
# Decoding or converting JSON format in dictionary using loads()
dict_obj = json.loads(person_data)
print(dict_obj)
# check type of dict_obj
print("Type of dict_obj", type(dict_obj))
# get human object details
print("Person......",  dict_obj.get('person'))

Вывод:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Type of dict_obj <class 'dict'>
Person...... {'name': 'John', 'sex': 'male'}

Расшифровка файла JSON или анализ файла JSON в Python

ПРИМЕЧАНИЕ. Декодирование файла JSON является операцией, связанной с вводом / выводом файла (I / O). Файл JSON должен существовать в вашей системе в указанном месте, которое вы упоминаете в своей программе.

Пример,

import json
#File I/O Open function for read data from JSON File
with open('X:/json_file.json') as file_object:
        # store file data in object
        data = json.load(file_object)
print(data)

Здесь данные — это словарь объекта Python.

Вывод:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}

Компактное кодирование в Python

Когда вам нужно уменьшить размер файла JSON, вы можете использовать компактную кодировку в Python.

Пример,

import json
# Create a List that contains dictionary
lst = ['a', 'b', 'c',{'4': 5, '6': 7}]
# separator used for compact representation of JSON.
# Use of ',' to identify list items
# Use of ':' to identify key and value in dictionary
compact_obj = json.dumps(lst, separators=(',', ':'))
print(compact_obj)

Вывод:

'["a", "b", "c", {"4": 5, "6": 7}]'

** Here output of JSON is represented in a single line which is the most compact representation by removing the space character from compact_obj **  

Формат JSON-кода (красивая печать)

  • Цель состоит в том, чтобы написать хорошо отформатированный код для понимания человеком. С помощью красивой печати любой может легко понять код.
  • Пример,
import json
dic = { 'a': 4, 'b': 5 }
''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. '''
formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))
print(formatted_obj)

Вывод:

{
   "a" : 4,
   "b" : 5
}

Чтобы лучше понять это, измените отступ на 40 и просмотрите результат:

Заказ кода JSON:

Атрибут sort_keys в аргументе функции dumps () отсортирует ключ в JSON в порядке возрастания. Аргумент sort_keys является логическим атрибутом. Если это правда, сортировка разрешена, иначе нет

Пример,

import json

x = {
  "name": "Ken",
  "age": 45,
  "married": True,
  "children": ("Alice", "Bob"),
  "pets": [ 'Dog' ],
  "cars": [
    {"model": "Audi A1", "mpg": 15.1},
    {"model": "Zeep Compass", "mpg": 18.1}
  	],
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Output:

{
    "age": 45,
    "cars": [ {
        "model": "Audi A1", 
        "mpg": 15.1
    },
    {
        "model": "Zeep Compass", 
        "mpg": 18.1
    }
    ],
    "children": [ "Alice",
		  "Bob"
	],
    "married": true,
    "name": "Ken",
    "pets": [ 
		"Dog"
	]
}

As you may observe the keys age, cars, children, etc are arranged in ascending order.

Сложное объектное кодирование Python

Сложный объект состоит из двух разных частей, которые

  1. Реальная часть
  2. Мнимая часть

Пример: 3 + 2i

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

Давайте создадим специальную функцию для проверки, объект сложен или пригоден для кодирования.

import json

# create function to check instance is complex or not
def complex_encode(object):
    # check using isinstance method
    if isinstance(object, complex):
        return [object.real, object.imag]
    # raised error using exception handling if object is not complex
    raise TypeError(repr(object) + " is not JSON serialized")


# perform json encoding by passing parameter
complex_obj = json.dumps(4 + 5j, default=complex_encode)
print(complex_obj)

Вывод:

'[4.0, 5.0]'

Декодирование сложных JSON-объектов в Python

Чтобы декодировать сложный объект в JSON, используйте параметр object_hook, который проверяет, содержит ли строка JSON сложный объект или нет. Пример,

import json
  # function check JSON string contains complex object
  def is_complex(objct):
    if '__complex__' in objct:
      return complex(objct['real'], objct['img'])
    return objct
  
  # use of json loads method with object_hook for check object complex or not
  complex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)
  #here we not passed complex object so it's convert into dictionary
  simple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)
  print("Complex_object......",complex_object)
  print("Without_complex_object......",simple_object)

Вывод:

Complex_object...... (4+5j)
Without_complex_object...... {'real': 6, 'img': 7}

Обзор класса сериализации JSON JSONEncoder

Класс JSONEncoder используется для сериализации любого объекта Python при выполнении кодирования. Он содержит три различных метода кодирования, которые

  • default (o) — реализовано в подклассе и возвращает сериализованный объект для объекта o .
  • encode (o) — так же, как метод json.dumps (), возвращает строку JSON структуры данных Python.
  • iterencode (o) — представляет строку одну за другой и кодирует объект o.

С помощью метода encode () класса JSONEncoder мы также можем кодировать любой объект Python.

# import JSONEncoder class from json
from json.encoder import JSONEncoder
colour_dict = { "colour": ["red", "yellow", "green" ]}
# directly called encode method of JSON
JSONEncoder().encode(colour_dict)

Вывод:

'{"colour": ["red", "yellow", "green"]}'

Обзор класса десериализации JSON JSONDecoder

Класс JSONDecoder используется для десериализации любого объекта Python при выполнении декодирования. Он содержит три различных метода декодирования, которые

  • default (o) — реализовано в подклассе и возвращает десериализованный объект o объект.
  • decode (o) — То же, что и метод json.loads (), возвращает структуру данных Python из строки или данных JSON.
  • raw_decode (o) — представляет словарь Python один за другим и декодирует объект o.

С помощью метода decode () класса JSONDecoder мы также можем декодировать строку JSON.

import json
# import JSONDecoder class from json
from json.decoder import JSONDecoder
colour_string = '{ "colour": ["red", "yellow"]}'
# directly called decode method of JSON
JSONDecoder().decode(colour_string)

Вывод:

{'colour': ['red', 'yellow']}

Декодирование данных JSON из URL: пример из реальной жизни

Мы получим данные CityBike NYC (Bike Sharing System) с указанного URL-адреса ( https://feeds.citibikenyc.com/stations/stations.json ) и преобразуем в словарный формат.

Пример,

ПРИМЕЧАНИЕ: — Убедитесь, что библиотека запросов уже установлена ​​в вашем Python. Если нет, откройте терминал или CMD и введите

  • (Для Python 3 или выше) pip3 устанавливает запросы
import json
import requests

# get JSON string data from CityBike NYC using web requests library
json_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")
# check type of json_response object
print(type(json_response.text))
# load data in loads() function of json library
bike_dict = json.loads(json_response.text)
#check type of news_dict
print(type(bike_dict))
# now get stationBeanList key data from dict
print(bike_dict['stationBeanList'][0]) 

Вывод:

<class 'str'>
<class 'dict'>
{
	'id': 487,
 	'stationName': 'E 20 St & FDR Drive',
	'availableDocks': 24,
	'totalDocks': 34,
	'latitude': 40.73314259,
	'longitude': -73.97573881,
	'statusValue': 'In Service',
	'statusKey': 1,
	'availableBikes': 9,
	'stAddress1': 'E 20 St & FDR Drive',
	'stAddress2': '',
	'city': '',
	'postalCode': '',
	'location': '', 
	'altitude': '', 
	'testStation': False, 
	'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': ''
}

Исключения, связанные с библиотекой JSON в Python:

  • Класс json.JSONDecoderError обрабатывает исключение, связанное с операцией декодирования. и это подкласс ValueError.
  • Исключение — json.JSONDecoderError (msg, doc)
  • Параметры Исключения есть,
    • msg — неформатированное сообщение об ошибке
    • doc — документы JSON проанализированы
    • pos — начать индекс документа, когда это не удалось
    • белье — линия не показывает соответствует поз
    • двоеточие — столбец не соответствует поз

Пример,

import json
#File I/O Open function for read data from JSON File
data = {} #Define Empty Dictionary Object
try:
        with open('json_file_name.json') as file_object:
                data = json.load(file_object)
except ValueError:
     print("Bad JSON file format,  Change JSON File")

Бесконечные и NaN числа в Python

Формат обмена данными JSON (RFC — Запрос комментариев) не допускает бесконечное значение или значение Nan, но в библиотеке Python-JSON нет ограничений на выполнение операций, связанных с бесконечным значением и значением Nan. Если JSON получает INFINITE и тип данных Nan, он преобразует его в литерал.

Пример,

import json
# pass float Infinite value
infinite_json = json.dumps(float('inf'))
# check infinite json type
print(infinite_json)
print(type(infinite_json))
json_nan = json.dumps(float('nan'))
print(json_nan)
# pass json_string as Infinity
infinite = json.loads('Infinity')
print(infinite)
# check type of Infinity
print(type(infinite))

Вывод:

Infinity
<class 'str'>
NaN
inf
<class 'float'>	

Повторный ключ в строке JSON

RFC указывает, что имя ключа должно быть уникальным в объекте JSON, но это не обязательно. Библиотека JSON Python не вызывает исключение повторяющихся объектов в JSON. Он игнорирует все повторяющиеся пары ключ-значение и рассматривает только последнюю пару ключ-значение среди них.

import json
repeat_pair = '{"a":  1, "a":  2, "a":  3}'
json.loads(repeat_pair)

Вывод:

{'a': 3}

CLI (интерфейс командной строки) с JSON в Python

json.tool предоставляет интерфейс командной строки для проверки синтаксиса JSON pretty-print. Давайте посмотрим на пример CLI

$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool

Вывод:

{
    "name": " Kings Authur "
}

Преимущества JSON в Python

  • Легко перемещаться назад между контейнером и значением (JSON в Python и Python в JSON)
  • Удобный для чтения (Pretty-print) объект JSON
  • Широко используется в обработке данных.
  • Не имеет одинаковую структуру данных в одном файле.

Ограничение реализации JSON в Python

  • В десериализаторе диапазона JSON и предсказании числа
  • Максимальная длина строки JSON и массивов JSON и уровней вложенности объекта.

Чит код

json.dumps (person_data)

Создать объект JSON

json.dump (person_data, file_write)

Создайте файл JSON с помощью файлового ввода-вывода Python

compact_obj = json.dumps (data, separators = (‘,’, ‘:’))

Сжатие объекта JSON путем удаления символа пробела из объекта JSON с использованием разделителя

formatted_obj = json.dumps (dic, indent = 4, separators = (‘,’, ‘:’))

Форматирование кода JSON с использованием отступа

sorted_string = json.dumps (x, отступ = 4, sort_keys = True)

Сортировка ключа объекта JSON по алфавиту

complex_obj = json.dumps (4 + 5j, по умолчанию = complex_encode)

Кодирование сложных объектов Python в JSON

JSONEncoder (). Закодировать (colour_dict)

Использование класса JSONEncoder для сериализации

json.loads (data_string)

Расшифровка строки JSON в словаре Python с помощью функции json.loads ()

json.loads (‘{«__ complex__»: true, «real»: 4, «img»: 5}’, object_hook = is_complex)

Декодирование сложного объекта JSON в Python

JSONDecoder (). Декодирование (colour_string)

Использование декодирования JSON в Python с десериализацией

 

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

Людям, работающим с веб часто приходится сталкиваться с необходимостью взаимодействовать с объектами JSON (JavaScript Object Notation). Это удобный способ структурированно хранить необходимые данные. Понятное дело, что и на Python должна быть реализация взаимодействия со строками JSON.

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

Распарсить строку json средствами Python.

Представим, что у нас есть следующая строка json, представляющая заказ товара в интернет-магазине:

{
  "orderID": 42,
  "customerName": "John Smith",
  "customerPhoneN": "555-1234",
  "orderContents": [
    {
      "productID": 23,
      "productName": "keyboard",
      "quantity": 1
    },
    {
      "productID": 13,
      "productName": "mouse",
      "quantity": 1
    }
  ],
  "orderCompleted": true
}

Тогда код на Python должен быть следующим:

import json

# строка которую будем парсить
json_string = """ {
  "orderID": 42,
  "customerName": "John Smith",
  "customerPhoneN": "555-1234",
  "orderContents": [
    {
      "productID": 23,
      "productName": "keyboard",
      "quantity": 1
    },
    {
      "productID": 13,
      "productName": "mouse",
      "quantity": 1
    }
  ],
  "orderCompleted": true
} """

# распарсенная строка
parsed_string = json.loads(json_string)

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

 

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

Примеры использования JSONPath в Python

Перевод статьи Python JSONPath Examples.

Что такое JSONPath?

JSONPath это язык запросов к JSON. Он очень похож на язык запросов XPath для XML. Вы формируете строку запроса и получаете нужное значение. Такое подход экономит память, так как необходимости разбазарить JSON полностью.

Библиотеки Python для JSONPath

Существует много JSONPath-библиотек для Python.

jsonpath: это портированая из Perl и JavaScript версия JSONPath.

jsonpath-rw: полностью Python-реализация JSONPath. Объект выражения JSONPath это объект первого класса, простой для анализа, преобразования, обработки, печати и расширения. Модуль jsonpath-rw-ext расширяет функционал библиотеки.

jsonpath-ng: окончательная реализация JSONPath цель которой соответствие стандарту, включая арифметические и бинарные сравнения. Эта библиотека соединяет модули jsonpath-rw и jsonpath-rw-ext и расширяет их.

Какую библиотеку использовать?

Модуль jsonpath-ng самый развитый и написан на чистом Python. Он поддерживает Python 2 и Python 3. Мы будем использовать этот модуль для примеров.

Установка модуля:

pip3.7 install jsonpath-ng



pip3.7 install jsonpath-ng

Разбор JSON

Рассмотрим пример разбора JSON и получения значения требуемого атрибута.

import json

from jsonpath_ng import jsonpath, parse

json_string = ‘{«id»:1, «name»:»Pankaj»}’
json_data = json.loads(json_string)

jsonpath_expression = parse(‘$.id’)

match = jsonpath_expression.find(json_data)

print(match)
print(«id value is», match[0].value)



import json

 

from jsonpath_ng import jsonpath, parse

 

json_string = ‘{«id»:1, «name»:»Pankaj»}’

json_data = json.loads(json_string)

 

jsonpath_expression = parse(‘$.id’)

 

match = jsonpath_expression.find(json_data)

 

print(match)

print(«id value is», match[0].value)

Вывод программы:

[DatumInContext(value=1, path=Fields(‘id’), context=DatumInContext(value={‘id’: 1, ‘name’: ‘Pankaj’}, path=Root(), context=None))]
id value is 1



[DatumInContext(value=1, path=Fields(‘id’), context=DatumInContext(value={‘id’: 1, ‘name’: ‘Pankaj’}, path=Root(), context=None))]

id value is 1

Мы используем модуль json для преобразования строки JSON в словарь.

Расписка списка

Ключи JSON могут содержать списки значений. Мы можем использовать JSONPath для анализа списоков и получения значений.

Предположим, что у нас есть JSON-файл db.json с следующим содержимым:

{
«employees»: [
{
«id»: 1,
«name»: «Pankaj»,
«salary»: «10000»
},
{
«name»: «David»,
«salary»: «5000»,
«id»: 2
}
]
}



{

  «employees»: [

    {

      «id»: 1,

      «name»: «Pankaj»,

      «salary»: «10000»

    },

    {

      «name»: «David»,

      «salary»: «5000»,

      «id»: 2

    }

  ]

}

Мы хотим разобрать этот JSON-файл и получить список идентификаторов сотрудников.

import json
from jsonpath_ng import jsonpath, parse

with open(«db.json», ‘r’) as json_file:
json_data = json.load(json_file)

print(json_data)

jsonpath_expression = parse(’employees[*].id’)

for match in jsonpath_expression.find(json_data):
print(f’Employee id: {match.value}’)



import json

from jsonpath_ng import jsonpath, parse

 

with open(«db.json», ‘r’) as json_file:

    json_data = json.load(json_file)

 

print(json_data)

 

jsonpath_expression = parse(’employees[*].id’)

 

for match in jsonpath_expression.find(json_data):

    print(f’Employee id: {match.value}’)

Вывод программы:

{’employees’: [{‘id’: 1, ‘name’: ‘Pankaj’, ‘salary’: ‘10000’}, {‘name’: ‘David’, ‘salary’: ‘5000’, ‘id’: 2}]}
Employee id: 1
Employee id: 2



{’employees’: [{‘id’: 1, ‘name’: ‘Pankaj’, ‘salary’: ‘10000’}, {‘name’: ‘David’, ‘salary’: ‘5000’, ‘id’: 2}]}

Employee id: 1

Employee id: 2

Рекомендовано к чтению

Python доступ к вложенным данным JSON

Я пытаюсь получить почтовый индекс для конкретного города с помощью zippopotam.нас. У меня есть следующий код, который работает, за исключением случаев, когда я пытаюсь получить доступ к post code ключ, который возвращает TypeError: expected string or buffer

r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()

data = json.loads(j)

print j['state']
print data['places']['latitude']

полный выход JSON:

{
"country abbreviation": "US",
"places": [
    {
        "place name": "Belmont",
        "longitude": "-71.4594",
        "post code": "02178",
        "latitude": "42.4464"
    },
    {
        "place name": "Belmont",
        "longitude": "-71.2044",
        "post code": "02478",
        "latitude": "42.4128"
    }
],
"country": "United States",
"place name": "Belmont",
"state": "Massachusetts",
"state abbreviation": "MA"
}

Спасибо за вашу помощь.

4 ответов


Places-это список, а не словарь. Поэтому эта строка ниже не должна работать:

print data['places']['latitude']

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

print data['places'][0]['post code']

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

r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()

print j['state']
print j['places'][1]['post code']

в вашем коде j — это уже данные json, а j [‘places’] — это список, а не дикт.

 r = requests.get('http://api.zippopotam.us/us/ma/belmont')
 j = r.json()

 print j['state']
 for each in j['places']:
    print each['latitude']

Я использую этот lib для доступа к вложенным ключам dict

https://github.com/mewwts/addict

 import requests
 from addict import Dict
 r = requests.get('http://api.zippopotam.us/us/ma/belmont')
 ad = Dict(r.json())

 print j.state
 print j.places[1]['post code']  # only work with keys without '-', space, or starting with number 

5

автор: Ezequiel Bertti


19,2. json — кодировщик и декодер JSON — документация Python 3.4.10

JSON (нотация объектов JavaScript), определенная
RFC 7159 (который устарел RFC 4627 ) и
ECMA-404,
это легкий формат обмена данными, вдохновленный
Синтаксис литерала объекта JavaScript
(хотя это не строгое подмножество JavaScript).

json предоставляет API, знакомый пользователям стандартной библиотеки
модули маршала и рассола.

Кодирование базовой иерархии объектов Python:

 >>> импортировать json
>>> json.dumps (['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print (json.dumps ("\" foo \ bar "))
"\" фу \ бар "
>>> печать (json.dumps ('\ u1234'))
"\ u1234"
>>> печать (json.dumps ('\\'))
"\\"
>>> print (json.dumps ({"c": 0, "b": 0, "a": 0}, sort_keys = True))
{"a": 0, "b": 0, "c": 0}
>>> из io import StringIO
>>> io = StringIO ()
>>> json.dump (['потоковый API'], io)
>>> io.getvalue ()
'["потоковый API"]'
 

Компактное кодирование:

 >>> импортировать json
>>> json.дампы ([1,2,3, {'4': 5, '6': 7}], separators = (',', ':'))
'[1,2,3, {"4": 5, "6": 7}]'
 

Довольно полиграфический:

 >>> импортировать json
>>> print (json.dumps ({'4': 5, '6': 7}, sort_keys = True, indent = 4))
{
    «4»: 5,
    «6»: 7
}
 

Расшифровка JSON:

 >>> импортировать json
>>> json.loads ('["foo", {"bar": ["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads ('"\\" foo \\ bar "')
'"foo \ x08ar'
>>> из io import StringIO
>>> io = StringIO ('["потоковый API"]')
>>> json.нагрузка (io)
['потоковый API']
 

Специализированное декодирование объекта JSON:

 >>> импортировать json
>>> def as_complex (dct):
... если '__complex__' в dct:
... вернуть комплекс (dct ['real'], dct ['imag'])
... вернуть dct
...
>>> json.loads ('{"__ complex__": true, "real": 1, "imag": 2}',
... object_hook = as_complex)
(1 + 2j)
>>> импортировать десятичный
>>> json.loads ('1.1', parse_float = decimal.Decimal)
Десятичный ('1.1')
 

Расширение JSONEncoder:

 >>> импортировать json
>>> класс ComplexEncoder (json.JSONEncoder):
... def default (self, obj):
... если isinstance (obj, complex):
... вернуть [obj.real, obj.imag]
... # Разрешить методу по умолчанию базового класса вызвать TypeError
... вернуть json.JSONEncoder.default (self, obj)
...
>>> json.dumps (2 + 1j, cls = ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder (). Кодировать (2 + 1j)
'[2.0, 1.0]'
>>> список (ComplexEncoder (). iterencode (2 + 1j))
['[2.0', ', 1.0', ']']
 

Использование json.tool из оболочки для проверки и красивой печати:

 $ echo '{"json": "obj"}' | pyt 

Чтение файла JSON с использованием Python

Полная форма JSON — это нотация объектов JavaScript.Это означает, что файл сценария (исполняемый), состоящий из текста на языке программирования, используется для хранения и передачи данных. Python поддерживает JSON через встроенный пакет под названием json . Чтобы использовать эту функцию, мы импортируем пакет json в скрипт Python. Текст в JSON представлен строкой в ​​кавычках, которая содержит значение в сопоставлении «ключ-значение» в пределах {} .

Чтение из JSON

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

Десериализация JSON

Десериализация JSON означает преобразование объектов JSON в соответствующие им объекты Python. Для этого используется метод load () / load () . Если вы использовали данные JSON из другой программы или полученные в виде строкового формата JSON, то их можно легко десериализовать с помощью load () / load () , который обычно используется для загрузки из строки, в противном случае корневой объект находится в list или dict.См. Следующую таблицу ниже.

ОБЪЕКТ JSON ОБЪЕКТ PYTHON
объект дикт
массив список
строка ул.
null Нет
номер (внутр.) внутренний
номер (реальный) поплавок
правда Истинно
ложный Ложь
  • json.load (): json.load () принимает файловый объект, анализирует данные JSON, заполняет словарь Python данными и возвращает их вам.

    Синтаксис:

     json.loads (объект файла) 

    Пример: Предположим, файл JSON выглядит так:

    Мы хотим прочитать содержимое этого файла. Ниже представлена ​​реализация.

    импорт json

    f = открыть ( 'data.json ' ,)

    данные = json.load (f)

    для i в данных [ 'emp_details' ]:

    печать (i)

    ф. Закрытие ()

    Выход:

  • json.load (): Если у вас есть строка JSON, вы можете проанализировать ее с помощью метода json.loads () . json.loads () не принимает путь к файлу, но содержимое файла в виде строки, используя fileobject.read () с json.loads () , мы можем вернуть содержимое файла.

    Синтаксис:

    json.loads (jsonstring) # для строки Json
    
    json.loads (fileobject.read ()) # для файлового объекта
     

    Пример: Этот пример показывает чтение как из строки, так и из файла JSON.Используется показанный выше файл.

    импорт json

    a = '{"name": "Bob", "languages": "English"}'

    y = json.loads (a)

    печать ( "Строка JSON =" , y)

    печать ()

    f = открыть ( 'data.json ' , "r" )

    данные = json.loads (f.read ())

Кодирование и декодирование JSON с помощью Python

Введение
JSON (нотация объектов JavaScript) часто используется между сервером и веб-приложением. Пример данных JSON:

 {
«человек»: [
{
«город»: «Сиэтл»,
«имя»: «Брайан»
},
{
«город»: «Амстердам»,
«имя»: » David "
}
]
}

Модуль json позволяет выполнять преобразование между объектами JSON и Python.

Связанный курс:
Анализ данных с помощью Python Pandas

Примеры преобразования JSON

Преобразование JSON в объект Python (Dict)
Для преобразования JSON в словарь Python используйте это:

 import json 

json_data = '{"name": "Brian", "city": "Seattle"}'
python_obj = json.loads (json_data)
print python_obj ["name"]
print python_obj [ "city"]

Преобразование JSON в объект Python (список)
Данные JSON можно напрямую сопоставить со списком Python.

 import json 

array = '{"напитки": ["кофе", "чай", "вода"]}'
data = json.loads (array)

для элемента данных ['напитки » ]:
элемент печати

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

 import json 
from decimal import Decimal

jsondata = '{"number": 1.573937639}'

x = json.load (jsondata, parse_float = Decimal)
print x ['number']

Преобразование JSON в объект Python (пример)
Данные JSON часто содержат несколько объектов, пример того, как использовать это ниже:

 import json 

json_input = '{"люди": [{"name": "Брайан", "city": "Сиэтл"}, {"name": "Дэвид", "city": "Амстердам "}]} '

json — Сериализатор нотации объектов JavaScript

Цель: Кодировать объекты Python как строки JSON и декодировать строки JSON в объекты Python.
В наличии: 2,6

Модуль json предоставляет API, аналогичный pickle для
преобразование объектов Python в памяти в сериализованное представление
известный как нотация объектов JavaScript (JSON). В отличие от рассола, JSON
имеет преимущество наличия реализаций на многих языках
(особенно JavaScript), что делает его пригодным для межприложений
общение. JSON, вероятно, наиболее широко используется для общения
между веб-сервером и клиентом в приложении AJAX, но не
ограничивается этой проблемной областью.

Кодирование и декодирование простых типов данных

Кодировщик понимает собственные типы Python по умолчанию (строка,
unicode, int, float, list, tuple, dict).

 импорт json

data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}]
print 'DATA:', repr (данные)

data_string = json.dumps (данные)
напечатать 'JSON:', data_string
 

Значения кодируются способом, очень похожим на repr () в Python.
выход.

 $ питон json_simple_types.py

ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
 

Кодирование, то повторное декодирование может не давать точно такой же тип
объект.

 импорт json

data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}]
data_string = json.dumps (данные)
напечатать 'ENCODED:', data_string

decoded = json.loads (строка_данных)
print 'DECODED:', декодировано

напечатайте 'ORIGINAL:', введите (данные [0] ['b'])
напечатайте 'DECODED:', введите (decoded [0] ['b'])
 

В частности, строки преобразуются в Unicode, а кортежи становятся
списки.

 $ питон json_simple_types_decode.ру

ЗАПИСАНО: [{"a": "A", "c": 3.0, "b": [2, 4]}]
РАСшифровано: [{u'a ': u'A', u'c ': 3.0, u'b': [2, 4]}]
ОРИГИНАЛ: <тип "кортеж">
РАСШИФРОВАНО: <тип 'список'>
 

Расходные материалы для людей в сравнении с компактным выводом

Еще одно преимущество JSON перед pickle заключается в том, что результаты
человек читаемый. Функция dumps () принимает несколько аргументов для
сделать вывод еще красивее. Например, sort_keys сообщает
кодировщик для вывода ключей словаря в отсортированном виде вместо
случайный порядок.

 импорт json

data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}]
print 'DATA:', repr (данные)

unsorted = json.dumps (данные)
напечатать 'JSON:', json.dumps (данные)
print 'SORT:', json.dumps (data, sort_keys = True)

first = json.dumps (данные, sort_keys = True)
second = json.dumps (данные, sort_keys = True)

print 'UNSORTED MATCH:', сначала несортированный ==
print 'SORTED MATCH:', first == second
 

Сортировка упрощает просмотр результатов на глаз, а также
можно сравнить вывод JSON в тестах.

 $ питон json_sort_keys.py

ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
СОРТИРОВКА: [{"a": "A", "b": [2, 4], "c": 3.0}]
Несортированный матч: ложь
ОТДЕЛЕННЫЕ МАТЧИ: Верно
 

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

 импорт json

data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}]
print 'DATA:', repr (данные)

print 'NORMAL:', json.dumps (data, sort_keys = True)
print 'INDENT:', json.dumps (data, sort_keys = True, indent = 2)
 

Когда отступ — неотрицательное целое число, вывод более точно
похож на pprint, с ведущими пробелами для каждого уровня
структура данных, соответствующая уровню отступа.

 $ питон json_indent.py

ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
НОРМАЛЬНЫЙ: [{"a": "A", "b": [2, 4], "c": 3.0}]
INDENT: [
  {
    «а»: «А»,
    "b": [
      2,
      4
    ],
    «c»: 3,0
  }
]
 

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

 импорт json

data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}]
print 'DATA:', repr (данные)
print 'repr (данные):', len (repr (данные))
напечатать 'дампы (данные):', len (json.dumps (данные))
print 'dumps (data, indent = 2):', len (json.dumps (data, indent = 2))
print 'дампы (данные, разделители):', len (json.dumps (data, separators = (',', ':')))
 

Аргумент разделителей для dumps () должен быть кортежем
содержащие строки для разделения элементов в списке и ключей от
значения в словаре.По умолчанию (‘,’, ‘:’). Удалив
пробела, мы можем произвести более компактный вывод.

 $ питон json_compact_encoding.py

ДАННЫЕ: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
репр (данные): 35
свалок (данных): 35
свалки (данные, отступ = 2): 76
дампов (данных, разделителей): 29
 

Словари кодирования

Формат JSON предполагает, что ключи словаря будут строками. Если
у вас есть другие типы ключей в вашем словаре, вы пытаетесь закодировать
объект выдаст ValueError .В одну сторону
Чтобы обойти это ограничение, нужно пропустить нестроковые ключи, используя
аргумент skipkeys:

 импорт json

data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0, ('d',): 'D tuple'}]

print 'Первая попытка'
пытаться:
    распечатать json.dumps (данные)
кроме (TypeError, ValueError) как err:
    напечатайте 'ERROR:', err

Распечатать
print 'Вторая попытка'
напечатать json.dumps (данные, skipkeys = True)
 

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

 $ python json_skipkeys.ру

Первая попытка
ОШИБКА: ключи должны быть строкой

Вторая попытка
[{"a": "A", "c": 3.0, "b": [2, 4]}]
 

Работа с вашими собственными типами

Все примеры до сих пор использовали встроенные типы Pythons, потому что
они изначально поддерживаются json. Это не редкость,
конечно, чтобы иметь свои собственные типы, которые вы хотите кодировать как
Что ж. Это можно сделать двумя способами.

Во-первых, нам понадобится класс для кодирования:

 класс MyObj (объект):
    def __init __ (self, s):
        я.s = s
    def __repr __ (сам):
        return ''% self.s
 

Простым способом кодирования экземпляра MyObj является определение
функция для преобразования неизвестного типа в известный тип. У тебя нет
чтобы выполнить кодирование самостоятельно, просто конвертируйте один объект в другой.

 импорт json
импорт json_myobj

obj = json_myobj.MyObj ('здесь идет значение экземпляра')

print 'Первая попытка'
пытаться:
    напечатать json.dumps (obj)
кроме TypeError, err:
    напечатайте 'ERROR:', err

def convert_to_builtin_type (obj):
    print 'default (', repr (obj), ')'
    # Преобразовать объекты в словарь их представления
    d = {'__class __': объект.__class __.__ name__,
          '__module __': obj .__ module__,
          }
    d.update (объект__ dict__)
    вернуться д

Распечатать
напечатать 'По умолчанию'
напечатать json.dumps (obj, по умолчанию = convert_to_builtin_type)
 

В convert_to_builtin_type () экземпляры классов не распознаются
by json конвертируются в словари с достаточной информацией
для воссоздания объекта, если программа имеет доступ к модулям Python
необходимо.

 $ питон json_dump_default.py

Первая попытка
ОШИБКА:  не сериализуемый JSON

По умолчанию
по умолчанию ()
{"s": "здесь идет значение экземпляра", "__module__": "json_myobj", "__class__": "MyObj"}
 

Чтобы декодировать результаты и создать экземпляр MyObj, нам нужно связать
в декодер, чтобы мы могли импортировать класс из модуля и
создать экземпляр.Для этого мы используем аргумент object_hook для
загружает ().

object_hook вызывается для каждого словаря, декодированного из
входящий поток данных, что дает нам возможность преобразовать словарь в
другой тип объекта. Функция ловушки должна возвращать объект, который она
хочет, чтобы вызывающее приложение получало вместо словаря.

 импорт json

def dict_to_object (d):
    если '__class__' в d:
        имя_класса = d.pop ('__ класс__')
        имя_модуля = d.pop ('__ module__')
        модуль = __импорт __ (имя_модуля)
        print 'МОДУЛЬ:', модуль
        class_ = getattr (модуль, имя_класса)
        print 'CLASS:', class_
        args = dict ((ключ.encode ('ascii'), value) для ключа, значение в d.items ())
        print 'INSTANCE ARGS:', args
        inst = class _ (** аргументы)
    еще:
        inst = d
    возвратиться

encoded_object = '[{"s": "здесь идет значение экземпляра", "__module__": "json_myobj", "__class__": "MyObj"}]'

myobj_instance = json.loads (encoded_object, object_hook = dict_to_object)
распечатать myobj_instance
 

Поскольку json преобразует строковые значения в объекты Unicode, нам нужно
перекодировать их как строки ASCII, прежде чем использовать их как ключевое слово
аргументы конструктору класса.

 $ питон json_load_object_hook.py

МОДУЛЬ: <модуль 'json_myobj' из '/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/json/json_myobj.pyc'>
КЛАСС: <класс 'json_myobj.MyObj'>
АРГИИ ЭКЗАМЕНА: {'s': u'значение экземпляра идет здесь '}
[]
 

Подобные хуки доступны для встроенных типов целых чисел
(parse_int), числа с плавающей запятой (parse_float) и
константы (parse_constant).

Классы кодировщика и декодера

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

JSONEncoder предоставляет итеративный интерфейс для создания «блоков».
закодированных данных, что упрощает запись в файлы или сеть
сокеты без необходимости представлять всю структуру данных в
объем памяти.

 импорт json

кодировщик = json.JSONEncoder ()
data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}]

для части в encoder.iterencode (data):
    print 'PART:', часть
 

Как видите, вывод формируется в логических единицах, а не в
на основе любого значения размера.

 $ питон json_encoder_iterable.py

ЧАСТЬ: [
ЧАСТЬ: {
ЧАСТЬ: "а"
ЧАСТЬ: :
ЧАСТЬ: «А»
ЧАСТЬ: ,
ЧАСТЬ: "c"
ЧАСТЬ: :
ЧАСТЬ: 3.0
ЧАСТЬ: ,
ЧАСТЬ: "b"
ЧАСТЬ: :
ЧАСТЬ 2
ЧАСТЬ:, 4
ЧАСТЬ: ]
ЧАСТЬ: }
ЧАСТЬ: ]
 

Метод encode () в основном эквивалентен
» .join (encoder.iterencode ()) с дополнительной проверкой ошибок
фронт.

Для кодирования произвольных объектов мы можем переопределить метод default ()
с реализацией, аналогичной той, что мы использовали выше в
convert_to_builtin_type ().

 импорт json
импорт json_myobj

класс MyEncoder (json.JSONEncoder):
    
    def default (self, obj):
        print 'default (', repr (obj), ')'
        # Преобразовать объекты в словарь их представления
        d = {'__class __': obj .__ class __.__ name__,
              '__module __': obj .__ module__,
              }
        d.update (объект__ dict__)
        вернуться д

obj = json_myobj.MyObj ('внутренние данные')
печать obj
напечатать MyEncoder (). encode (obj)
 

Вывод такой же, как и в предыдущей реализации.

 $ python json_encoder_default.ру


по умолчанию ()
{"s": "внутренние данные", "__module__": "json_myobj", "__class__": "MyObj"}
 

Для декодирования текста и последующего преобразования словаря в объект требуется
немного больше работы по настройке, чем в нашей предыдущей реализации, но не
много.

 импорт json

класс MyDecoder (json.JSONDecoder):
    
    def __init __ (сам):
        json.JSONDecoder .__ init __ (self, object_hook = self.dict_to_object)

    def dict_to_object (self, d):
        если '__class__' в d:
            имя_класса = d.поп ('__ класс__')
            имя_модуля = d.pop ('__ module__')
            модуль = __импорт __ (имя_модуля)
            print 'МОДУЛЬ:', модуль
            class_ = getattr (модуль, имя_класса)
            print 'CLASS:', class_
            args = dict ((key.encode ('ascii'), value) для ключа, значение в d.items ())
            print 'INSTANCE ARGS:', args
            inst = class _ (** аргументы)
        еще:
            inst = d
        возвратиться

encoded_object = '[{"s": "здесь идет значение экземпляра", "__module__": "json_myobj", "__class__": "MyObj"}]'

myobj_instance = MyDecoder ().декодировать (encoded_object)
распечатать myobj_instance
 

И вывод такой же, как в предыдущем примере.

 $ питон json_decoder_object_hook.py

МОДУЛЬ: <модуль 'json_myobj' из '/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/json/json_myobj.pyc'>
КЛАСС: <класс 'json_myobj.MyObj'>
АРГИИ ЭКЗАМЕНА: {'s': u'значение экземпляра идет здесь '}
[]
 

Работа с потоками и файлами

До сих пор во всех примерах мы предполагали, что можем (и
должен) содержать закодированную версию всей структуры данных в
память за один раз.С большими структурами данных может быть предпочтительнее
для записи кодировки непосредственно в файловый объект. Удобство
функции load () и dump () принимают ссылки на файловые
объект для чтения или записи.

 импорт json
импортировать временный файл

data = [{'a': 'A', 'b' :( 2, 4), 'c': 3.0}]

f = tempfile.NamedTemporaryFile (режим = 'w +')
json.dump (данные, f)
f.flush ()

напечатать open (f.name, 'r'). read ()
 

Сокет будет работать так же, как и обычный дескриптор файла.
здесь используется.

 $ питон json_dump_file.py

[{"a": "A", "c": 3.0, "b": [2, 4]}]
 

Хотя он не оптимизирован для чтения только части данных за раз,
функция load () по-прежнему предлагает преимущество инкапсуляции
логика генерации объектов из потокового ввода.

 импорт json
импортировать временный файл

f = tempfile.NamedTemporaryFile (режим = 'w +')
f.write ('[{"a": "A", "c": 3.0, "b": [2, 4]}]')
f.flush ()
f.seek (0)

напечатать json.load (f)
 
 $ питон json_load_file.py

[{u'a ': u'A', u'c ': 3.0, u'b ': [2, 4]}]
 

Смешанные потоки данных

JSONDecoder включает метод raw_decode () для декодирования
структура данных, за которой следуют другие данные, например данные JSON с завершающим
текст. Возвращаемое значение — это объект, созданный путем декодирования ввода.
data и индекс в этих данных, указывающий, где остановилось декодирование.

 импорт json

декодер = json.JSONDecoder ()
def get_decoded_and_remainder (input_data):
    obj, end = decoder.raw_decode (input_data)
    осталось = input_data [конец:]
    возврат (объект, конец, оставшийся)

encoded_object = '[{"a": "A", "c": 3.0, "b": [2, 4]}] '
extra_text = 'Этот текст не JSON.'

напечатайте "сначала JSON:"
объект, конец, оставшийся = get_decoded_and_remainder ('' .join ([encoded_object, extra_text]))
print 'Object:', obj
print 'Конец проанализированного ввода:', конец
print 'Остающийся текст:', repr (оставшийся)

Распечатать
напечатайте 'JSON встроенный:'
пытаться:
    obj, конец, оставшийся = get_decoded_and_remainder (
        '' .join ([дополнительный_текст, кодированный_объект, дополнительный_текст])
        )
кроме ValueError, ошибка:
    напечатайте 'ERROR:', err

    
 

К сожалению, это работает, только если объект появляется в начале
входа.

 $ питон json_mixed_data.py

Сначала JSON:
Объект: [{u'a ': u'A', u'c ': 3.0, u'b': [2, 4]}]
Конец проанализированного ввода: 35
Остающийся текст: "Этот текст не JSON".

Встроенный JSON:
ОШИБКА: не удалось декодировать объект JSON.
 

См. Также

JSON
Стандартная библиотека документации для этого модуля.
Нотация объектов JavaScript
Домашняя страница JSON с документацией и реализациями на других языках.
http: // code.google.com/p/simplejson/
simplejson, от Боба Ипполито и др., Является внешним
поддерживаемая версия для разработки библиотеки json включена
с Python 2.6 и Python 3.0. Он поддерживает в обратном направлении
совместимость с Python 2.4 и Python 2.5.
jsonpickle
jsonpickle позволяет сериализовать любой объект Python в JSON.
Сохранение данных и обмен
Другие примеры хранения данных из программ Python.

Python JSON |菜鸟 教程

章节 我们 将为 大家 介绍 如何 使用 Python 语言 来 编码 和 解码 JSON 对象。

JSON (нотация объектов JavaScript) 是 一种 轻量级 的 数据 交换 格式 , 易于 人 阅读 和 编写。


JSON 函数

使用 JSON 函数 需要 导入 json 库 : импорт json

函数 描述
json.дампы 将 Python 对象 编码 成 JSON 字符串
json.loads 将 已 编码 的 JSON 字符串 解码 为 Python 对象

json.dumps

json.dumps 用于 将 Python 对象 编码 成 JSON 字符串。

语法

json.dumps (obj, skipkeys = False, sure_ascii = True, check_circular = True, allow_nan = True, cls = None, indent = None, separators = None, encoding = "utf-8", default = None, sort_keys = False, ** кВт)
 

实例

以下 实例 将 数组 编码 为 JSON 格式 数据 :

实例

#! / usr / bin / python
import json

data = [{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}]

data2 = json.дампы (данные)
печать (данные2)

以上 代码 执行 结果 为 :

[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]
 

使用 参数 让 JSON 数据 格式化 输出 :

实例

#! / usr / bin / python
import json

data = [{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}]

data2 = json.dumps ({‘a’: ‘Runoob’, ‘b’: 7}, sort_keys = True, indent = 4, separators = (‘,’, ‘:’))
print (data2)

以上 代码 执行 结果 为 :

{
    "a": "Runoob",
    "b": 7
}
 

питон, json, 的 转化 对照 表 :

Python JSON
дикт объект
список, кортеж массив
ул, юникод строка
int, long, float номер
Истинно правда
Ложь ложь
Нет null

json.грузы

json.loads 解码 JSON 数据。 该 函数 Python 字段 的 数据 类型。

语法

json.loads (s [, кодировка [, cls [, object_hook [, parse_float [, parse_int [, parse_constant [, object_pairs_hook [, ** kw]]]]]]]])
 

实例

以下 实例 展示 了 Python 如何 解码 JSON 对象 :

实例

#! / usr / bin / python
import json

jsonData = ‘{«a»: 1, «b»: 2, «c»: 3, «d»: 4, «e»: 5}’;

текст = json.loads (jsonData)
печать (текст)

以上 代码 执行 结果 为 :

{u'a ': 1, u'c': 3, u'b ': 2, u'e': 5, u'd ': 4}
 

json 到 python 的 类型 对照 表 :

JSON Python
объект дикт
массив список
строка юникод
номер (внутр.) int, длинный
номер (реальный) поплавок
правда Истинно
ложный Ложь
null Нет

更多 内容 参考 : https: // docs.python.org/2/library/json.html

фунтов стерлингов


使用 第三方 库 : Demjson

Demjson python 的 第三方 模块 库 , 可 用于 编码 和 JSON 数据 , 包含 了 JSONLint 的 格式化 及 校验 功能。

Github 地址 : https: //github.com/dmeranda/demjson

官方 地址 : http: //deron.meranda.us/python/demjson/

环境 配置

在 使用 Demjson 编码 或 解码 JSON 数据 前 , 我们 需要 先 安装 Demjson 模块。 本 教程 我们 会 下载 Demjson 并 安装 :

$ tar -xvzf demjson-2.2.3.tar.gz
$ cd demjson-2.2.3
$ python setup.py установить
 

更多 安装 介绍 查看 : http: // deron.meranda.us/python/demjson/install

JSON 函数

函数 描述
кодировать 将 Python 对象 编码 成 JSON 字符串
декодировать 的 JSON 字符串 Python 对象

кодировать

Python encode () 函数 用于 将 Python 对象 编码 成 JSON 字符串。

语法

demjson.encode (self, obj, nest_level = 0)
 

实例

以下 实例 将 数组 编码 为 JSON 格式 数据 :

实例

#! / usr / bin / python
import demjson

data = [{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}]

json = demjson.кодировать (данные)
печать (json)

以上 代码 执行 结果 为 :

[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
 

декодировать

Python 使用 demjson.decode () 函数 解码 JSON 数据。 该 函数 Python 字段 的 数据 类型。

语法

demjson.decode (сам, txt)
 

实例

以下 实例 展示 了 Python 如何 解码 JSON 对象 :

实例

#! / usr / bin / python
import demjson

json = ‘{«a»: 1, «b»: 2, «c»: 3, «d»: 4, «e»: 5}’;

текст = demjson.декодировать (json)
печать (текст)

以上 代码 执行 结果 为 :

{u'a ': 1, u'c': 3, u'b ': 2, u'e': 5, u'd ': 4}
 

json-py скачать | SourceForge.net

  • Присоединиться / Войти
  • Программное обеспечение с открытым исходным кодом
  • Программное обеспечение для бизнеса
  • Блог
  • Около
  • Справка
  • Подключить

  • Конфиденциальность
  • Подробнее
    • Статьи
    • Создать
    • Самые популярные проекты
    • Сделки
    • Статус сайта
    • @sfnet_ops
    • @sourceforge
    • Документация сайта
    • Запрос в службу поддержки
    • Условия
    • Отказаться
    • Объявить

о нет! Не удалось загрузить некоторые стили.😵

Пожалуйста, попробуйте перезагрузить эту страницу

Помогите

Создайте

Присоединиться
Авторизоваться

Программное обеспечение с открытым исходным кодом

  • Бухгалтерский учет
  • CRM
  • Бизнес-аналитика
  • CAD
  • PLM
  • ударов в минуту
  • Управление проектами
  • Управление знаниями
  • Развитие
  • Продажа
  • Электронная коммерция
  • ERP
  • HR
  • Управление ИТ
  • ИТ-безопасность
  • Офис
  • Наука и техника
  • Игры
  • Все программное обеспечение

Программное обеспечение для бизнеса

  • CRM

    CRM

    Обслуживание клиентов

    Опыт работы с клиентами

    Торговая точка

    Ведущее управление

    Управление событиями

    Опрос

  • Финансы

    Финансы

    Бухгалтерский учет

    Выставление счетов и выставление счетов

    Бюджетирование

    Процесс оплаты

    Отчет о затратах

  • Разработка приложения

    Разработка приложений

    Управление жизненным циклом приложений

    Интеграция

    Разработка с низким кодом

    Разработка без кода

    Разработка мобильных приложений

    Управление тестированием

    UX

  • Аналитика

    Аналитика

    Большие данные

    Бизнес-аналитика

    Прогнозная аналитика

.

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

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

2021 © Все права защищены. Карта сайта