如何展平嵌套的JSON文件以检索期望的字段

时间:2020-10-20 20:18:04

标签: python json

我有以下JSON文件:

[ 
  {'docType': 'custom',
   'fields': 
    {
      'general_info': None,
      'power': 20,
      'safety': 
       {
         'boundingBox': [2.375,9.9,4.98,9.9,4.98,10.245,2.375,10.245],
         'confidence': 0.69,
         'page': 22,
         'text': 'bla-bla-bla',
         'type': 'string',
         'valueString': 'bla-bla-bla'
       },
       'replacement': 
        {
          'boundingBox': [2.505,2.51,2.54,2.51,2.54,3.425,2.505,3.425],
          'confidence': 0.262,
          'page': 7,
          'text': 'bla-bla-bla',
          'type': 'string',
          'valueString': 'bla-bla-bla'
         },
        'document_id': 'x123'
     } 
   }
]

我想遍历所有field值并从嵌套字段中提取text。预期结果如下:

{
   'labels': 
    {
       'general_info': None,
       'power': 20,
       'safety': 'bla-bla-bla',
       'replacement': 'bla-bla-bla',
       'document_id': 'x123'
     } 
}

我怎样才能弄平我的JSON文件并获得预期的结果?

这是我到目前为止尝试过的:

import json

json_object = json.load(raw_json)

fields = {}
for field in json_object:
    for attribute, value in field.items():
        fields[attribute] = value

fields_json = json.dumps(fields, indent = 4)

但是,我不知道如何递归地输入嵌套字段

3 个答案:

答案 0 :(得分:1)

您可以编写一个递归函数。当值是字典时,它应该自行调用。

这是一个例子。

def flatten_fields(d):
    out = {}
    for k, v in d.items():
        if isinstance(v, dict):
            out[k] = flatten_fields(v)
        elif k == 'text':
            return v
        elif isinstance(v, list):
            continue
        else:
            out[k] = v
    return out

要运行它,您可以迭代json_object中的每个字典。上面只有一个示例,但这是方法:

labels = []
for d in json_object:
    labels.append({'labels': flatten_fields(d.get('fields', {}))})

labels
# returns:
[{'labels': {'general_info': None,
   'power': 20,
   'safety': 'bla-bla-bla',
   'replacement': 'bla-bla-bla',
   'document_id': 'x123'}}]

答案 1 :(得分:1)

将其加载为python列表后,对其进行循环以进入名为dict的{​​{1}}键,并在找到{{1 }},其类型为fields,您必须对其进行循环并获取keysvalues的内部值,然后仅获取值,而value为父级{{1 }}

示例

dict

输出

key

答案 2 :(得分:1)

您应该使用递归来浏览字典。 我的解决方案是:

import json
with open('raw_json', 'r') as j:
    d = json.load(j)
    # print(d)

def dict_walker(obj ,key=None):
    if isinstance(obj, dict):
        for key in obj:
            dict_walker(obj[key], key)
    else:
        print(key, ':', obj)

dict_walker(d)

OUT:

docType : custom
general_info : None
power : 20
boundingBox : [2.375, 9.9, 4.98, 9.9, 4.98, 10.245, 2.375, 10.245]
confidence : 0.69
page : 22
text : bla-bla-bla
type : string
valueString : bla-bla-bla
boundingBox : [2.505, 2.51, 2.54, 2.51, 2.54, 3.425, 2.505, 3.425]
confidence : 0.262
page : 7
text : bla-bla-bla
type : string
valueString : bla-bla-bla
document_id : x123