繁体   English   中英

在Python中编辑现有JSON

[英]Editing Existing JSON in Python

我从服务器以给定格式提取一些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上找到很多东西,而不是转储和加载。

这是你想要做的吗?

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结构中已包含imagekey键的任何对象中。 因此,如果需要,您可能必须使用更特定于images项目的内容。

哦,如果您想将其编码回JSON字符串,则只需将最后一行更改为

>>> reencoded_with_viewurl = json.dumps(json.loads(myString, object_hook = addImageKey))

根据您要解码/编码的数据量,我建议使用cjson重新编码数据的可能性。 与simplejson / json相比,它闪电般快。 不幸的是,它不支持诸如object_hook之类的东西。

我猜最简单的方法是将其放入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)

我能想到的最简单的方法是使用simplejson将反序列化为本地python,修改本地python,然后将其序列化回JSON。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM