如何展平嵌套 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)

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


料青山看我应如是
浏览 135回答 3
3回答

慕少森

将其加载为 python 列表后,只需循环它以获取dict调用的内部键fields并简单地对其进行循环keys,values一旦找到value其类型,dict您就必须对其进行循环并获取内部值,key然后text仅获取值并成为key父级key例子from pprint import pprintres = {}for sub in content:   for x, y in sub['fields'].items():    if isinstance(y, dict):        for i, e in y.items():            if i == 'text':                res[x] = e    else:        res[x] = yfinal = {}final['label'] = respprint(final)输出{'label': {'document_id': 'x123',           'general_info': None,           'power': 20,           'replacement': 'bla-bla-bla',           'safety': 'bla-bla-bla'}}

沧海一幻觉

你应该使用递归来遍历字典。我的解决方案是:import jsonwith 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)出去:docType : customgeneral_info : Nonepower : 20boundingBox : [2.375, 9.9, 4.98, 9.9, 4.98, 10.245, 2.375, 10.245]confidence : 0.69page : 22text : bla-bla-blatype : stringvalueString : bla-bla-blaboundingBox : [2.505, 2.51, 2.54, 2.51, 2.54, 3.425, 2.505, 3.425]confidence : 0.262page : 7text : bla-bla-blatype : stringvalueString : bla-bla-bladocument_id : x123

繁华开满天机

您可以编写一个递归函数。当值是字典时,它应该调用自身。这是一个例子。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'}}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python