在Python中编辑现有JSON
我从服务器获取了一些格式为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这样的功能。