编写一个在python中解析嵌套json文件的函数

时间:2018-07-13 12:14:34

标签: python

我有一个看起来像这样的json文件:

{
"mAutomaticTestCompleted": true,
"mAutomaticTestList": [
  {
    "mName": "acceleratorEntity",
    "mTestStatus": true,
    "mX": 3.8043518,
    "mY": 8.114105,
    "mZ": -3.3895721
  },
  {
    "mName": "barometerEntity",
    "mTestStatus": false,
    "mValue": 0
  }]
}

实际上有很多字段,例如mAutomaticTestlist,它们都是看起来像这样的对象的列表。 我需要编写一个函数,将device_name和JSON本身作为参数并返回mTestStatus字段的值。

这是我的尝试:

def hasPassed(device_name, data):
    if isinstance(data, dict):
        for key, value in data.items():
            if not isinstance(value, dict) and not isinstance(value, list):
                if key == 'mName' and value == device_name:
                    return data['mTestStatus']
                else:
                    return hasPassed(device_name, value)
            elif isinstance(data, list):
                for element in data:
                    return hasPassed(device_name, element)

此功能的问题在于它不能遍历整个JSON对象。


编辑:

所以我希望我的功能以这种方式工作:

hasPassed('barometerEntity', json_obj) 

将返回False cos,它是对应于device_name(在这种情况下为barometerEntity)的'mTestStatus'的值。

2 个答案:

答案 0 :(得分:1)

您的代码格式错误,应为:

def hasPassed(device_name, data):
    if isinstance(data, dict):
        if 'mName' in data and data['mName'] == device_name :
            return data['mTestStatus']
        else :
            for k in data :
                if hasPassed(device_name, data[k]) : return True
    if isinstance(data, list):
        for element in data:
            if hasPassed(device_name, element) : return True
    return False

最后3行-向左移动。

该函数的末尾应该有return,当您的数据不是list而不是dict时返回-否则您的选择将返回None并可能导致崩溃

>>> hasPassed( 'barometerEntity', a)
False
>>> hasPassed( 'acceleratorEntity', a)
True
>>> 

答案 1 :(得分:-1)

尝试一下:

import json

def hasPassed(device_name, data):

  test_list = json.loads(obj)["mAutomaticTestList"]

  for elt in test_list:
      if elt["mName"] == device_name: return elt["mTestStatus"]