Python:展平和解析 JSON 的某些部分

Python: Flatten and Parse certain sections of JSON

我的输入 JSON 看起来像这样:

> {"payment": {"payment_id": "AA340", "payment_amt": "20", "chk_nr": "321749", "clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John", adj:{"adj_id":"W123","adj_cd":"45"}}, {"clm_id": "9999", "name": "Dilton", adj:{"adj_id":"X123","adj_cd":"5"}}]}}}

我需要这样的输出:

{"clm_id": "1A2345",adj:{"adj_id":"W123"},"payment_amt": "20", "chk_nr": "321749"}
{"clm_id": "9999"adj:{"adj_id":"X123"},"payment_amt": "20", "chk_nr": "321749"}

所以代码接受一个 JSON 文档,解析索赔数组部分并通过向每个部分添加支付信息来对其进行规范化。甚至嵌套的 JSON 也被解析。

我能够解析数据,但不确定如何仅规范化数据的特定部分。

下面的代码将解析数据,但不会规范化

keep = ["payment","payment_id","payment_amt", "clm_list", "dtl", "clm_id","adj","adj_id"]

old_dict={"payment": {"payment_id": "AA340", "payment_amt": "20", "chk_nr": "321749", "clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John", "adj": {"adj_id": "W123", "adj_cd": "45"}}, {"clm_id": "9999", "name": "Dilton", "adj": {"adj_id": "X123", "adj_cd": "5"}}]}}}

def recursively_prune_dict_keys(obj, keep):
        if isinstance(obj, dict):
                return dict([(k, recursively_prune_dict_keys(v, keep)) for k, v in obj.items() if k in keep])
        elif isinstance(obj, list):
                return [recursively_prune_dict_keys(item, keep) for item in obj]
        else:
                return obj

new_dict = recursively_prune_dict_keys(old_dict, keep)
conv_json=new_dict["payment"]
print json.dumps(conv_json)

简单地挑选数据可能是一种巧妙的方法,例如;

new_dict = recursively_prune_dict_keys(old_dict, keep)
payment = old_dict['payment']
claims = payment['clm_list']['dtl']
for claim in claims:
    claim['payment_amt'] = payment['payment_amt']
    claim['chk_nr'] = payment['chk_nr']
print(json.dumps(claims))

这将产生;

[{"chk_nr": "321749", "clm_id": "1A2345", "payment_amt": "20", "adj": {"adj_id": "W123"}}, {"chk_nr": "321749", "clm_id": "9999", "payment_amt": "20", "adj": {"adj_id": "X123"}}]

这包含您要求的输出,但与您可能希望看到的不完全一样。

首先,如果没有方括号 [],您想要的输出是不正确的 JSON,这会使它成为一个列表。但是,我们可以通过单独丢弃每个声明来摆脱它;

new_dict = recursively_prune_dict_keys(old_dict, keep)
payment = old_dict['payment']
claims = payment['clm_list']['dtl']
for claim in claims:
    claim['payment_amt'] = payment['payment_amt']
    claim['chk_nr'] = payment['chk_nr']
    print(json.dumps(claim))

这给出了;

{"name": "John", "clm_id": "1A2345", "payment_amt": "20", "adj": {"adj_cd": "45", "adj_id": "W123"}, "chk_nr": "321749"}
{"name": "Dilton", "clm_id": "9999", "payment_amt": "20", "adj": {"adj_cd": "5", "adj_id": "X123"}, "chk_nr": "321749"}

这与您想要的输出很接近,除了顺序可能有所不同。 Python 听写不是天生有序的。但是,您可以对它们进行排序。因此,如果顺序很重要,您将需要通读 How to Sort Python Dictionaries by Key or Value