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