2009-06-11 5 views
46

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

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

ответ

60

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

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

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

От www.json.org:

JSON строится на двух структурах:

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

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

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

17

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

3

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

3

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

simplejson.dumps (данные) возвращается с

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

который является массив JSON, который является то, что вы хотите, так как вы дали этот питон массив.

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

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

, который Javascript выйдет как объект.

3

Try:

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: На основании ответа Паоло.

19

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

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