Python JSON编码
我试图在Python中将数据编码为JSON,并且遇到了相当多的麻烦。 我相信这个问题只是一个误会。
我对Python相对比较陌生,从来没有真正熟悉Python的各种数据types,所以这很可能是我搞砸了。
目前我正在声明一个列表,循环和另一个列表,并在另一个列表中追加一个列表:
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模块(s)
- 我正在使用不适当的数据types。
Python lists
转换为JSON arrays
。 它给你的是一个完全有效的JSONstring,可以在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编码)string的数据参数:
>>> encoded_str = json.dumps( data ) >>> encoded_str '[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'
第二个是相反的,返回对应于其(JSON编码)string参数的数据:
>>> 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
(或Python 2.6及更高版本中的json
库)中, loads
需要一个JSONstring并返回一个Python数据结构, dumps
需要一个Python数据结构并返回一个JSONstring。 JSONstring可以对Javascript数组进行编码,而不仅仅是对象,而Python列表对应于编码数组的JSONstring。 获取JSONstring,如
{"apple":"cat", "banana":"dog"}
你传递给json.dumps
的Python对象可能是:
dict(apple="cat", banana="dog")
尽pipeJSONstring也是相同dict
有效Python语法。 我相信你说你期望的特定string是简单的无效的JSON语法,但是。
你正在编码的数据是一个无密钥数组,所以JSON用[]括号进行编码。 有关更多信息,请访问www.json.org。 花括号用于具有键/值对的列表。
来自www.json.org:
JSONbuild立在两个结构上:
名称/值对的集合。 在各种语言中,这被实现为对象,logging,结构,字典,散列表,键控列表或关联数组。 有序的值列表。 在大多数语言中,这是作为数组,vector,列表或序列来实现的。
一个对象是一组无名的名称/值对。 一个对象以{(左大括号)开始并以}(右大括号)结束。 每个名称后跟:(冒号),名称/值对由(逗号)分隔。
数组是值的有序集合。 一个数组以[(左括号)开头,结尾为](右括号)。 值由(逗号)分隔。
JSON对列表( [ "one", "two", "three" ]
)使用方括号,对于键/值字典(也称为JavaScript中的对象, {"one":1, "two":"b"}
)。
转储是非常正确的,你会得到一个三个元素的列表,每个元素是两个string的列表。
如果你想要一本字典,也许是这样的:
x = simplejson.dumps(dict(data)) >>> {"pear": "fish", "apple": "cat", "banana": "dog"}
您期望的string(“ {{"apple":{"cat"},{"banana":"dog"}}
')是无效的JSON。 一个
所以,simplejson.loads需要一个jsonstring并返回一个数据结构,这就是为什么你在那里得到那个types的错误。
simplejson.dumps(数据)返回
'[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'
这是一个JSON数组,这是你想要的,因为你给了这个Python数组。
如果你想得到一个“对象”types的语法,你会做
>>> 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
注:基于保罗的答案。