如何在Python中逐层解析JSON文件,并根据该级别中可用的键搜索特定ID?

2024-06-16 11:42:32 发布

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

我有非常具体的问题。 这是我随身携带的json文件。在

    {
      "name" : "myname",
      "value" : 0,
      "level" : [ {
      "name" : "myname",
      "value" : 1,
      "level" : [ {
            "name" : "something",
            "value" : 2,
            "level" : [ {
            "name" : "something",
            "value" : 3,
                "level" : [ {
                    "name" : "Phy",
                    "value" : 4,
                    "something_retrive" : [ {
                       "mysupername" : "retrive",
                       "someID" : "blahblah"
             }, {
                       "something_retrive" : [ {
                       "mysupername" : "retrive",
                       "someID" : "blahblah"
                       "randomdata" : [ {
                       "data1":"val1"
                       "data1":"val1"   

             }, {
                       "name" : "some",
                       "size" : 3,
                       "type" : "float",
             } ]
          } ]
       } ]
     } ]
   } ]
  } ]
}

我需要在level内部搜索level(可以是递归的任何数字),我还需要知道它们的编号,直到我找到“something”为止,而且在这里面也可以有多个“mysupername”,所以我需要在知道可用的“mysupername”的数量后再检索其中一些。在

我现在正在使用python,使用它们我可以加载json并使用这个问题的答案访问数据Parsing json and searching through it

但我不知道如何在JSON文件中执行搜索和brwosing,也不知道自己处于特定的级别。在

任何帮助、建议或参考都会有帮助。在

(我找了两天都没找到)


Tags: 文件namejsonvaluephylevelsomethingval1
1条回答
网友
1楼 · 发布于 2024-06-16 11:42:32

注意,根据定义,字典是无序的,因此您可能需要强制JSON解码器use an ordereddict。不过,一旦您有了数据,就可以很容易地遍历和构建数据结构,这些结构为您提供了访问任何给定数据所必需的键元组。下面是一个例子:

mydict =   {
            "name" : "myname",
            "value" : 0,
            "level" : [ {
                "name" : "myname",
                "value" : 1,
                "level" : [ {
                    "name" : "something",
                    "value" : 2,
                    "level" : [ {
                        "name" : "something",
                        "value" : 3,
                        "level" : [ {
                            "name" : "Phy",
                            "value" : 4,
                            "something_retrive" : [
                                {
                                    "mysupername" : "retrive",
                                    "someID" : "blahblah"
                                }, {
                                    "something_retrive" : [ {
                                        "mysupername" : "retrive",
                                        "someID" : "blahblah",
                                        "randomdata" : [
                                            {
                                                "data1":"val1"
                                            }, {
                                                "name" : "some",
                                                "size" : 3,
                                                "type" : "float",
                                            }
                                        ]
                                    } ]
                                }
                            ]
                        } ]
                    } ]
                } ]
            }]
        }

import collections

def findpaths(container):
    def recurse(container, prefix):
        if isinstance(container, list):
            container = enumerate(container)
        else:
            container = container.items()
        for key, value in container:
            keys[key].append(prefix)
            fullkey = prefix + (key,)
            if isinstance(value, (list, dict)):
                recurse(value, fullkey)
            else:
                values[value].append(fullkey)
    keys = collections.defaultdict(list)
    values = collections.defaultdict(list)
    recurse(container, ())
    return keys, values

def retrievebypath(container, keys):
    for key in keys:
        container = container[key]
    return container

keys, values = findpaths(mydict)

print("\nBy key:\n")
for key, value in sorted(keys.items(), key=str):
    print(key, sorted(value))

print("\nBy value:\n")
for key, value in sorted(values.items(), key=str):
    print(key, sorted(value))

print("\nRetrieving container which has second appearance of mysupername\n")
print(retrievebypath(mydict, keys["mysupername"][1]))

相关问题 更多 >