2009-06-11 80 views
46

我试图在Python中将数据编码为JSON,并且遇到了相当多的麻烦。我相信这个问题只是一个误解。Python JSON编码

我对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(或在Python 2.6以后图书馆json),loads需要一个JSON字符串,并返回一个Python数据结构,dumps需要Python数据结构并返回一个JSON字符串。 JSON字符串可以对Javascript数组进行编码,而不仅仅是对象,而Python列表对应于编码数组的JSON字符串。为了得到一个JSON字符串,如

{"apple":"cat", "banana":"dog"} 

传递给json.dumps Python的对象可以是:

dict(apple="cat", banana="dog") 

虽然JSON字符串也是一样dict有效的Python语法。但是,我相信你所说的特定字符串只是无效的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

尝试:

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 

注:根据保罗的回答。

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