Python顶层JSON索引

2024-06-01 01:33:08 发布

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

我在调用的API中有以下JSON文件:

{
  "14500": [
    {
      "5": {
        "versionName": "VersionOne",
        "expand": "executionSummaries",
        "name": "Regression",
        "projectId": 15006,
        "startDate": "",
        "executionSummaries": {
          "executionSummary": []
        }
      },
      "7": {
        "versionName": "VersionOne",
        "expand": "executionSummaries",
        "versionId": 14500,
        "projectId": 15006,
        "startDate": "19/Sep/16",
        "executionSummaries": {
          "executionSummary": []
        }
      },
      "-1": {
        "versionName": "VersionOne",
        "expand": "executionSummaries",
        "name": "Ad hoc",
        "modifiedBy": "",
        "projectId": 15006,
        "startDate": "",
        "executionSummaries": {
          "executionSummary": []
        }
      },
      "recordsCount": 3
    }
  ],
  "14501": [
    {
      "-1": {
        "versionName": "Version 2",
        "expand": "executionSummaries",
        "projectId": 15006,
        "startDate": "",
        "executionSummaries": {
          "executionSummary": []
        }
      },
      "recordsCount": 1
    }
  ],
}

我需要遍历顶层和下一级(例如“14500”和“5”、“7”等)来查找键和值。因此,例如,我需要搜索整个JSON文件,以找到与“Regression”匹配的名称,并找到“projectd”的一组数据值,可能还有其他字符串。我以前是用数据[“level1”][0][“level2”]等来完成的,但在这种情况下,这些数字永远不会相同,所以我不知道如何称呼它们。我在浏览了这里的一些帖子之后写了以下内容,但是它只适用于一个级别,而不是JSON中的下一个级别。在

^{pr2}$

Tags: 文件数据nameapijson级别expandregression
3条回答
def find_in_dicts(d, key, value): #This finds all dictionaries that has the given key and value
    for k, v in d.items():
        if k == key:
            if v == value:
                yield d
        else:
            if isinstance(v, dict):
               for i in find_in_dicts(v, key, value):
                   yield i
            elif isinstance(v, list) and isinstance(v[0], dict):
                for item in v:
                    for i in find_in_dicts(item, key, value):
                        yield i

不管数据结构有多深,这都应该递归地工作。我现在还不能测试它,但我希望elast能给你一些想法。在

下面是一个部分脚本,它适合您的确切输入。如果它在适当的级别找到name: regression,它将打印一些相关的值。在

for k, list_of_dicts in requestData.items():
    for d in list_of_dicts:
        for k, v in d.items():
            if isinstance(v, dict) and v.get('name') == "Regression":
                print '%s: %s %s'%(v.get('projectId'),
                                   v.get('versionName'),
                                   v.get('versionId'))

看看神奇的^{}图书馆!它有一个^{}函数,在您的例子中可能是一个过度使用的功能,但是了解它是一件很好的事情。下面是一种从嵌套数据结构中提取带有'name': 'Regression'的所有dict的优雅方法:

from boltons.iterutils import remap

# Copy your actual data here
data = {'14500': [{'5': {'name': 'Regression'}, '7': {'name': 'Ad hoc'}}]}

regressions = []

def visit(path, key, value):
    if isinstance(value, dict) and value.get('name') == 'Regression':
        # You can do whatever you want here!
        # If you're here then `value` is a dict
        # and its `name` field equals to 'Regression'.
        regressions.append(value)
    return key, value

remap(data, visit=visit, reraise_visit=False)

assert regressions == [{'name': 'Regression'}]

如果您只需要特定级别的dict,还可以在visit函数中检查path的长度。在

相关问题 更多 >