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 

注:基于保罗的答案。