在Python中编辑现有JSON

2 投票
4 回答
11655 浏览
提问于 2025-04-16 10:59

我从服务器获取了一些格式为JSON的数据:

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

我需要在每个元素中添加一个新的元素“viewurl”,这个元素的值要用“imagekey”来生成。比如,结果应该是:

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

可能有简单的方法可以做到这一点,但我在简单的JSON处理库simplejson中,除了dumps和load,找不到其他的相关信息。

4 个回答

1

我想到的最简单的方法就是使用simplejson这个库,把JSON数据转换成Python能理解的格式,然后对这个Python格式的数据进行修改,最后再把它转换回JSON格式。

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)
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结构中任何已经包含imagekey键的对象里。所以,如果需要的话,你可能得用一些更具体的东西来处理images里的项目。

哦,如果你想把它再编码成JSON字符串,你只需把最后一行改成

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

根据你解码/编码的数据量,我建议可以考虑使用cjson来重新编码数据。它的速度比simplejson/json快得多。不过,不幸的是,它不支持像object_hook这样的功能。

撰写回答