Кодирование 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
- Я не понимаю модуль JSON Pythons
- Я использую неприемлемый тип данных.
Ответы
Ответ 1
Python lists
перевести на JSON arrays
. То, что он дает вам, является вполне допустимой строкой JSON, которая может использоваться в приложении Javascript. Чтобы получить то, что вы ожидали, вам нужно использовать dict
:
>>> json.dumps({'apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "apple": "cat", "banana": "dog"}'
Ответ 2
Я думаю, вы просто обмениваетесь свалками и грузами.
>>> 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
Ответ 3
В 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
Данные, которые вы кодируете, являются массивом без ключа, поэтому JSON кодирует его с помощью [] скобок. Дополнительную информацию об этом см. на www.json.org. Фигурные фигурные скобки используются для списков с парами ключ/значение.
Из www.json.org:
JSON построен на двух структурах:
Коллекция пар имя/значение. В на разных языках, это реализуется как объект, запись, структура, словарь, хеш-таблица, список клавиш или ассоциативный массив. Упорядоченный список значений. В большинство языков, это реализуется как массив, вектор, список или последовательность.
Объект - это неупорядоченный набор пар имя/значение. Объект начинается с {(левая скобка) и заканчивается} (правая скобка). Каждое имя сопровождается по: (двоеточие) и парам имя/значение разделяются знаком (запятая).
Массив - это упорядоченный набор значения. Массив начинается с [(слева скобка) и заканчивается на] (справа скобка). Значения разделяются, (Запятая).
Ответ 5
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. А
Ответ 6
Итак, 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, выйдет как объект.
Ответ 7
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: Основано на ответе Паоло.