如何用simplejson正确解析JSON?
问题描述:
我可以有以下的JSON字符串:如何用simplejson正确解析JSON?
{ "response" : [ [ { "name" : "LA_",
"uid" : 123456
} ],
[ { "cid" : "1",
"name" : "Something"
} ],
[ { "cid" : 1,
"name" : "Something-else"
} ]
] }
或执行下列操作之一:
{"error":"some-error"}
{ "response" : [ [ { "name" : "LA_",
"uid" : 123456
} ],
[ { "cid" : "1",
"name" : ""
} ],
[ { "cid" : 1,
"name" : "Something-else"
} ]
] }
{ "response" : [ [ { "name" : "LA_",
"uid" : 123456
} ] ] }
所以,我不知道如果所有的孩子的和元素的存在。这将足以做到以下几点核查获得Something
值:
if jsonstr.get('response'):
jsonstr = jsonstr.get('response')[1][0]
if jsonstr:
name = jsonstr.get('name')
if jsonstr: # I don't need empty value
# save in the database
可以在同一被简化?
答
不保证每次解析它时内部对象的排序都是一样的,因此索引不是一种安全的选择,通过name
属性设置为Something
来引用对象的索引。
而不是嵌套所有这些if
语句,您可以使用list comprehension逃脱。注意,如果您遍历response
键,你会得到一个列表的列表,每一个字典里面它:
>>> data = {"response":[[{"uid":123456,"name":"LA_"}],[{"cid":"1","name":"Something"}],[{"cid":1,"name":"Something-else"}]]}
>>> [lst for lst in data.get('response')]
[[{'name': 'LA_', 'uid': 123456}], [{'name': 'Something', 'cid': '1'}], [{'name': 'Something-else', 'cid': 1}]]
如果指数在每个列表(lst[0]
),你最终列表中的第一项对象:
>>> [lst[0] for lst in data.get('response')]
[{'name': 'LA_', 'uid': 123456}, {'name': 'Something', 'cid': '1'}, {'name': 'Something-else', 'cid': 1}]
如果再添加一个if
条件到您的列表解析,以匹配对象name
属性,你会得到包含您想要的对象与单一项目的列表:
>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something']
[{'name': 'Something', 'cid': '1'}]
然后通过索引中的第一项是最后的名单,你就会得到所需的对象:
>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something'][0]
{'name': 'Something', 'cid': '1'}
所以,那么你可以把它转换成一个功能,你的生活的:
def get_obj_by_name(data, name):
objects = [lst[0] for lst in data.get('response', []) if lst[0].get('name') == name]
if objects:
return objects[0]
return None
print get_obj_by_name(data, 'Something')
# => {'name': 'Something', 'cid': '1'}
print get_obj_by_name(data, 'Something')['name']
# => 'Something'
它应该是有弹性的,并返回None
如果response
关键是没有找到:
print get_obj_by_name({"error":"some-error"}, 'Something')
# => None
谢谢,@jathan主义,如此详细的答案。其实,'东西'是我正在寻找的价值 - 它可以是任何其他价值。第三方并没有给我提供这个元素的任何标识符,所以我必须依赖他们的顺序。 –
不客气。 :) – jathanism