JSON-кодировка Python - PullRequest
50 голосов
/ 12 июня 2009

Я пытаюсь закодировать данные в 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
  • Я не понимаю, модуль (и) JSON Pythons
  • Я использую неподходящий тип данных.

Ответы [ 7 ]

65 голосов
/ 12 июня 2009

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

>>> json.dumps({'apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "apple": "cat", "banana": "dog"}'
20 голосов
/ 12 июня 2009

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

>>> 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
17 голосов
/ 12 июня 2009

В 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.

4 голосов
/ 12 июня 2009

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

с www.json.org:

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

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

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

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

3 голосов
/ 12 июня 2009

Попробуйте:

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

Примечание: основано на ответе Паоло.

3 голосов
/ 12 июня 2009

Итак, 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, выйдет как объект.

3 голосов
/ 12 июня 2009

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. A

...