60

我正在尝试在 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 模块
  • 我使用了不合适的数据类型。
4

7 回答 7

74

Pythonlists转换为 JSON arrays。它给你的是一个完全有效的 JSON 字符串,可以在 Javascript 应用程序中使用。要获得您的期望,您需要使用dict

>>> json.dumps({'apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "apple": "cat", "banana": "dog"}'
于 2009-06-11T21:41:16.277 回答
27

我认为您只是在交换转储负载

>>> 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
于 2009-06-11T23:07:36.930 回答
17

simplejson(或jsonPython 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 语法。

于 2009-06-11T21:41:48.337 回答
4

您正在编码的数据是一个无键数组,因此 JSON 使用 [] 括号对其进行编码。有关详细信息,请参阅 www.json.org。花括号用于带有键/值对的列表。

来自 www.json.org:

JSON 建立在两种结构之上:

名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。值的有序列表。在大多数语言中,这被实现为数组、向量、列表或序列。

对象是一组无序的名称/值对。对象以 {(左大括号)开始,以 }(右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。

数组是值的有序集合。数组以 [(左括号)开头,以 ](右括号)结尾。值用 ,(逗号)分隔。

于 2009-06-11T21:41:11.300 回答
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。一种

于 2009-06-11T21:45:40.697 回答
3

因此,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将作为一个对象出现。

于 2009-06-11T21:46:21.443 回答
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

注意:基于 Paolo 的回答。

于 2009-06-11T21:46:39.480 回答