在Python中编辑现有JSON

在Python中编辑现有JSON,python,simplejson,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":

我正在以给定格式从服务器中提取一些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上找到更多内容。

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

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

这就是你想要做的吗

data = simplejson.loads(yourString)
for image in data['images']:
    image['viewurl'] = '/view?imagekey=%s' %(image['imagekey'])
您还可以使用对象挂钩。这适用于您的示例,但您可能需要根据实际数据对其进行一些调整:

>>> 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\u钩子将把viewurl键/值添加到JSON结构中已经包含
imagekey
键的任何对象。因此,如果需要,您可能需要对
图像中的项目使用更具体的内容

哦,如果你想把它编码回一个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的信息?文档页面几乎就是它。。。