在Python中编辑现有JSON

时间:2011-02-01 04:58:48

标签: python simplejson

我以给定的格式从服务器中提取一些JSON:

{"images": [{"rating": 5.0, "thumburl": "http://something.jpg", "description": "dfgd", "submitdate": "2011-01-29T07:54:02", "submituser": "J", "imagekey": "a"}, ...]}

我必须使用“imagekey”为每个元素添加一个新元素“viewurl”。例如,结果将是

{"images": [{"rating": 5.0, "thumburl": "http://something.jpg", "description": "dfgd", "submitdate": "2011-01-29T07:54:02", "submituser": "J", "imagekey": "a", "viewurl": "/view?imagekey=a"}, ...]}

这可能是一种简单的方法,但是除了转储和加载之外,我在simplejson上找不到太多东西。

4 个答案:

答案 0 :(得分:4)

这是你想要做的吗?

data = simplejson.loads(yourString)
for image in data['images']:
    image['viewurl'] = '/view?imagekey=%s' %(image['imagekey'])

您还可以使用 object_hook 。这适用于您的示例,但您可能需要根据实际数据进行一些调整:

>>> def addImageKey(dataPart):
...     if dataPart.has_key('imagekey'):
...         dataPart['viewurl'] = '/view?imagekey=%s' %dataPart['imagekey']
...     return dataPart
... 
>>> decoded_with_viewurl = json.loads(myString, object_hook = addImageKey)

我提到需要调整它的可能性的原因是因为在它的当前形式中,addImageKey object_hook会将viewurl键/值添加到JSON结构中包含{{1}的任何对象已经密钥了。因此,如果需要,您可能必须使用imagekey中更具体的内容。

哦,如果你想把它编码回JSON字符串,你可以把最后一行改为

images

根据您正在解码/编码的数据量,我建议使用cjson重新编码数据的可能性。与simplejson / json相比,它闪电般快速。不幸的是它没有像object_hook这样的东西的支持。

答案 1 :(得分:2)

我想最简单的方法是将它放入python,操作它,然后将其转储回JSON:

>>> import simplejson
>>> data = simplejson.loads('''{"images": [{"rating": 5.0, "thumburl": "http://something.jpg", "description": "dfgd", "submitdate": "2011-01-29T07:54:02", "submituser": "J", "imagekey": "a"}]}''')
>>> for image in data['images']:
    key = image['imagekey']
    image["viewurl"] = "/view?imagekey=%s" % key


>>> outdata = simplejson.dumps(data)

答案 2 :(得分:1)

我能想到的最简单的方法是使用simplejson对本机python进行反序列化,修改本机python,并将其序列化为JSON。

答案 3 :(得分:0)

嗯,你有两种选择。在字符串上使用正则表达式或将JSON解析为Python对象,然后使用imageurl值创建一个新属性,然后生成另一个JSON字符串。