【问题标题】:Scan through nested json response for a specific value without knowing names在不知道名称的情况下扫描嵌套的 json 响应以获取特定值
【发布时间】:2019-08-09 14:06:55
【问题描述】:

我从 UI 收到大量(超过 3000 行)JSON 响应。我需要扫描整个响应并搜索值“未回答”。找到此值后,我需要获取有关该响应的其他信息。

响应是高度嵌套的,最多 7 层。我确实知道该值具有“值”键,但该键多次出现在响应中。每次调用的第一个“value”键下的嵌套和项目数可以不同。

这是响应的一小部分示例。我需要找到值“未回答”的每个实例。我没有在值键下的响应中显示其他数据。

{
"data": {
 "reviewData": [
   0: {
     "value": [
       1: {
         "value": "Answer"
       },
       2: {
         "value": "Not Answered"
       },
       3: {
         "value": "Answer"
       }
     ]
   },
   1: {
     "value": [
       1: {
         "value": "Not Answered"
       },
       2: {
         "value": "Not Answered"
       },
       3: {
         "value": "Answer"
        }
      ]
    }
  ]
 }
}

我知道我可以将所有这些都放入一个字符串并使用正则表达式,但这无助于获取我需要的其他数据。感谢您的帮助!

【问题讨论】:

  • 你能举个json格式的例子吗?

标签: python json


【解决方案1】:

您可以使用生成器遍历您的字典并以元组的形式生成指向'Not Answered' 值的路径:

def walk(obj):
    for key, value in obj.items():
        if isinstance(value, dict):
            yield from ((key,) + x for x in walk(value))
        elif value == 'Not Answered':
            yield (key,)

对于您的示例,这给出了以下输出:

[('data', 'reviewData', '0', 'value', '2', 'value'),
 ('data', 'reviewData', '1', 'value', '1', 'value'),
 ('data', 'reviewData', '1', 'value', '2', 'value')]

如果您需要访问周围信息,您可以通过在嵌套字典上使用 __getitem__ reduce 提供的任何深度的路径:

from functools import reduce

for path in walk(test_dict):
    info = reduce(lambda obj, key: obj[key], path[:-1], test_dict)

【讨论】:

  • 这很好用。除了我在获取数组中的值时遇到问题。我已经更新了我的示例以说明我的意思
  • 我搞定了。我做了第二个和你一样的函数来处理数组,然后我来回折腾数据。谢谢!
  • @tdlanghe 当然,您可以为此添加额外的isinstance 检查(或创建单独的生成器)。但就目前而言,您问题中的示例 dict 语法无效。列表中的某些东西搞砸了。
【解决方案2】:

你可以使用这样的递归函数:

def find_not_anwsered_object(obj, sink):
    for key in obj.keys():
        if obj[key] == "Not Answered":
            sink.append(obj)
        elif isinstance(obj[key], dict):
            find_not_answered_object(obj[key], sink)


    return sink

response = {} # your JSON response
print(find_not_answered_object(response, [])

【讨论】:

    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多