在python的复杂json文件中查找元素(键或值)索引的最佳方法是什么?

2024-06-24 12:35:12 发布

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

我有一个复杂的JSON文件,由多个嵌入式列表和字典组成。在这个文件的某个地方,有一个元素“ABC”:它可以是列表元素、键或值。我可以使用哪种方法在文件中搜索以找到此元素的索引?你知道吗

示例:

{"Record": 
    {"RecordType": "No",
    "RecordNumber": 11,
    "Section": [
      {
        "Heading": "Structure",
        "Description": "Compound",
        "Information": [
          {
            "ReferenceNumber": 88,
            "Name": "2D Structure",
            "BoolValue": true
          }
        ]
      },]}}

我想搜索2D Structure并让Python返回: {"Record"}{"Section"}[0]{"Information"}[0]{"Name"}。你知道吗

我试着搜索一些“反向字典”——在那里我可以解析一个字符串并返回一个位置,但没有找到任何有用的东西。但也许有一些简单的解决办法?你知道吗


Tags: 文件方法namejson元素示例列表字典
1条回答
网友
1楼 · 发布于 2024-06-24 12:35:12

我假设您已将JSON反序列化为Python对象:

import json
with open('path/to/my.json') as f:
    obj = json.load(f)

现在,“最简单”的解决方案是暴力搜索整个嵌套结构。这是一个快速的函数,我做了这样做。虽然效率不高,但很有效:

def search_nested(obj, target, acc):
    if isinstance(obj, list):
        for i, e in enumerate(obj):
            if isinstance(e, (list, dict)):
                x = search_nested(e, target,  acc + [i])
                if x:
                    return x
            elif e == target:
                return acc + [i]
    elif isinstance(obj, dict):
        for k, v in obj.items():
            if target == v:
                return acc + [k]
            elif target == k: #how do you want to handle this?
                return acc # Maybe?
            elif isinstance(v, (list, dict)):
                x = search_nested(v, target, acc +[k])
                if x:
                    return x

所以,在repl中:

In [3]: obj
Out[3]:
{'Record': {'RecordNumber': 11,
  'RecordType': 'No',
  'Section': [{'Description': 'Compound',
    'Heading': 'Structure',
    'Information': [{'BoolValue': True,
      'Name': '2D Structure',
      'ReferenceNumber': 88}]}]}}

In [4]: search_nested(obj, "2D Structure", [])
Out[4]: ['Record', 'Section', 0, 'Information', 0, 'Name']

相关问题 更多 >