正在分析JSON以查找键的值

2024-03-29 08:49:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解析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
      }
   }
}

这是我到目前为止的情况

^{pr2}$

预期产量:

>>> json_scan(json_obj, "timestamp")
1416958459185

通过调试器时,我能够找到所需的值,但是result = None行将result重置为None,在方法的末尾,我得到的值是None。我不知道怎么解决这个问题。我试图移除预设值,但我没有尝试移除结果行。在


Tags: 方法noneeventjson示例dataapplicationversion
3条回答

问题是没有将递归调用分配给result:

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:
                result = json_scan(json_obj[element], key)
            elif type(json_obj[element]) == ListType:
                result = json_scan(element, key)
    return result

另一个问题是你的扫描对列表不起作用-json_obj[element]只对dicts有效-但是由于你的数据没有列表,所以它现在可以工作。您应该完全删除列表处理(除非您确实有列表,否则算法需要更改)。在

使用json库来解析json文件(应删除一些逗号),并使用本机dict类型:

def json_scan(json_obj, key):
    d = json.loads(json_obj)

    def _(dictobj, lookup):
        if lookup in dictobj.keys():
            return dictobj[lookup]
        else:
            for sub_dictobj in [d for d in dictobj.values() if type(d) == DictType]:
                result = _(sub_dictobj, lookup)
                if result:
                    return result
            return None

    return _(d, key)

更完整的版本:

^{pr2}$

编辑(2015/04/25):

在看了@PyCon 2015视频后,我遇到了dict_digger:

http://jtushman.github.io/blog/2013/11/06/dict-digger/https://github.com/jtushman/dict_digger

有测试。。。在

您应该从if语句内部返回结果。所以,你的代码应该是:

def json_scan(json_obj, key):
    for element in json_obj:
        if str(element) == key:
            result = json_obj[element]
            return result
        else:
            if type(json_obj[element]) == DictType:
                json_scan(json_obj[element], key)
            elif type(json_obj[element]) == ListType:
                json_scan(element, key)
    return None

这样,如果找到结果,它将立即返回,而不是重置为“无”。如果找不到它,它最后仍然不会返回任何结果。在

相关问题 更多 >