为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 2023-12-12 14:56:02
我有以下 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 jsonjson_object = json.load(raw_json)fields = {}for field in json_object:    for attribute, value in field.items():        fields[attribute] = valuefields_json = json.dumps(fields, indent = 4)但是,我不知道如何递归进入嵌套字段
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

将其加载为 python 列表后,只需循环它以获取dict调用的内部键fields并简单地对其进行循环keys,values一旦找到value其类型,dict您就必须对其进行循环并获取内部值,key然后text仅获取值并成为key父级key


例子

from pprint import pprint


res = {}

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] = y


final = {}

final['label'] = res

pprint(final)


输出

{'label': {'document_id': 'x123',

           'general_info': None,

           'power': 20,

           'replacement': 'bla-bla-bla',

           'safety': 'bla-bla-bla'}}


查看完整回答
反对 回复 2023-12-12
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

你应该使用递归来遍历字典。我的解决方案是:


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)

出去:


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


查看完整回答
反对 回复 2023-12-12
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

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


这是一个例子。


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'}}]


查看完整回答
反对 回复 2023-12-12
  • 3 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信