Кодировка Python JSON

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

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

В настоящее время я объявляю список, перебираю и другой список и добавляю один список в другой:

import simplejson, json
data = [['apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]

x = simplejson.loads(data)
# >>> typeError: expected string or buffer..

x = simplejson.dumps(stream)
# >>> [["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]
# - shouldn't JSON encoded strings be like: {{"apple":{"cat"},{"banana":"dog"}}

поэтому я либо:

  • Я не понимаю синтаксис JSON
  • Я не понимаю модуль(ы) Pythons JSON
  • я использую неподходящий тип данных.

7 ответов


Python lists перевести на JSON arrays. То, что он дает вам, - это совершенно правильная строка JSON, которая может использоваться в приложении Javascript. Чтобы получить то, что вы ожидали, вам нужно будет использовать dict:

>>> json.dumps({'apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "apple": "cat", "banana": "dog"}'

Я думаю, вы просто обмениваетесь свалки и нагрузки.

>>> import json
>>> data = [['apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]

первый возвращает в виде строки (закодированной JSON) свой аргумент данных:

>>> encoded_str = json.dumps( data )
>>> encoded_str
'[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'

второй делает обратное, возвращая данные, соответствующие его (JSON-кодированному) строковому аргументу:

>>> decoded_data = json.loads( encoded_str )
>>> decoded_data
[[u'apple', u'cat'], [u'banana', u'dog'], [u'pear', u'fish']]
>>> decoded_data == data
True

на simplejson (или библиотека json в Python 2.6 и более поздних версий), loads принимает строку JSON и возвращает структуру данных Python,dumps принимает структуру данных Python и возвращает строку JSON. Строка JSON может кодировать массивы Javascript, а не только объекты, а список Python соответствует строке JSON, кодирующей массив. Чтобы получить строку JSON, такую как

{"apple":"cat", "banana":"dog"}

объект Python, который вы передаете json.dumps можно:

dict(apple="cat", banana="dog")

хотя строка JSON также допустимый синтаксис Python для того же dict. Однако я считаю, что конкретная строка, которую вы ожидаете, является просто недопустимым синтаксисом JSON.


данные кодируемого ключа массива, поэтому JSON кодирует его с [] скобках. Смотри www.json.org для получения дополнительной информации об этом. Фигурные скобки используются для списков с парами ключ/значение.

от www.json.org:

JSON построен на двух структурах:

коллекция пар имя/значение. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список ключей или ассоциативный матрица. - упорядоченный список значений. В в большинстве языков это реализовано как массив, вектор, список или последовательность.

объект-неупорядоченный набор пары имя/значение. Начинается объект с {(левая скобка) и заканчивается } (правая скобка). Каждое имя следует купить : (двоеточие) и пары имя/значение разделяются запятыми.

массив-это упорядоченная коллекция ценности. Массив начинается с [ (слева скобки) и заканчивается ] ( кронштейн.) Значения разделенные , (запятая.)


JSON использует квадратные скобки для списков ( [ "one", "two", "three" ]) и фигурные скобки для словарей ключей/значений (также называемых объектами в JavaScript,{"one":1, "two":"b"}).

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

если тебе нужен словарь, может быть, что-то вроде этого:

x = simplejson.dumps(dict(data))
>>> {"pear": "fish", "apple": "cat", "banana": "dog"}

ожидаемая строка ('{{"apple":{"cat"},{"banana":"dog"}}') не является допустимым JSON. А


Итак, simplejson.loads принимает строку json и возвращает структуру данных, поэтому вы получаете ошибку этого типа.

simplejson.dumps (data) возвращается с

'[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'

который является массивом json, который вы хотите, так как вы дали этому массиву python.

Если вы хотите получить синтаксис типа "объект", вы вместо этого сделаете

>>> data2 = {'apple':'cat', 'banana':'dog', 'pear':'fish'}
>>> simplejson.dumps(data2)
'{"pear": "fish", "apple": "cat", "banana": "dog"}'

который является javascript выйдет как объект.


попробуй:

import simplejson
data = {'apple': 'cat', 'banana':'dog', 'pear':'fish'}
data_json = "{'apple': 'cat', 'banana':'dog', 'pear':'fish'}"

simplejson.loads(data_json) # outputs data
simplejson.dumps(data) # outputs data_joon

NB: на основе ответа Паоло.