【发布时间】:2014-12-01 17:50:50
【问题描述】:
我正在尝试解析 json 以找到所需键的值。我这样做是递归的。如果有其他更快或更有效的方法可以做到这一点,我愿意
示例 json:
{
"data_version":"5",
"application":{
"platform":"iPhone",
"os":"iPhone OS",
"locale":"en_US",
"app_version":"unknown",
"mobile":{
"device":"iPhone",
"carrier":"Verizon",
}
},
"event_header":{
"accept_language":"en-us",
"topic_name":"mobile-clickstream",
"server_timestamp":1416958459572,
"version":"1.0"
},
"session":{
"properties":{
}
},
"event":{
"timestamp":1416958459185,
"properties":{
"event_sequence_number":97
}
}
}
这是我目前所拥有的
def json_scan(json_obj, key):
result = None
for element in json_obj:
if str(element) == key:
result = json_obj[element]
else:
if type(json_obj[element]) == DictType:
json_scan(json_obj[element], key)
elif type(json_obj[element]) == ListType:
json_scan(element, key)
return result
预期输出:
>>> json_scan(json_obj, "timestamp")
1416958459185
当我通过调试器时,我能够找到所需的值,但result = None 行将结果重置为None,在方法结束时,我得到的值是None。我不知道如何解决这个问题。我尝试删除该行但出现错误,因为结果未预设为值。
【问题讨论】:
-
您需要分配递归调用 - 例如
result = json_scan(element, key) -
@jonrsharpe 我试过了,但该行仍然将结果重置为 None
-
你是什么意思“这条线”?你根本不需要
result = None。 -
@jonrsharpe 我删除了
result = None行并添加了您为递归调用建议的调整(result = json_scan(json_obj[element], key)和result = json_scan(element, key)),但我得到了在赋值错误之前引用的局部变量“result” -
在这种情况下,
for element in json_obj:不会在其中一个调用中发生(无论json_obj是空的),因此您在分配之前到达return result。