简体   繁体   English

决定JSON数据python解析平面

[英]Decide JSON data python parsing flat

it's been a while since I've been stuck on a subject to which I can't find the desired solution.已经有一段时间我一直被困在一个我无法找到所需解决方案的主题上。

Example : I have a json given like this:示例:我有一个这样的json:

{
    "SECTION": {
        "ID": 1,
        "COMMENT" : "foo bar ",
        "STRUCTURE" : {
            "LIEN" : [
                {
                    "from": "2020-01-01",
                    "to": "2020-01-03"
                },
                {
                    "from": "2020-01-04",
                    "to": "2999-01-07"
                }
            ]
        },
        "CONTEXTE":{
            "NATURE": {
                "text": "lorem smdlk fjq lsjdf mqjsh dflkq hs dfhkq g"
            }
        }

    }
}

I would like to have output, for example this:我想要输出,例如:

{
    "SECTION.ID": 1,
    "SECTION.COMMENT": "foo bar ",
    "SECTION.STRUCTURE.LIEN.from": "2020-01-01",
    "SECTION.STRUCTURE.LIEN.to": "2020-01-03",
    "SECTION.CONTEXTE.NATURE.text": "lorem smdlk fjq lsjdf mqjsh dflkq hs dfhkq g"
}

{
    "SECTION.ID": 1,
    "SECTION.COMMENT": "foo bar ",
    "SECTION.STRUCTURE.LIEN.from": "2020-01-04",
    "SECTION.STRUCTURE.LIEN.to": "2999-01-07",
    "SECTION.CONTEXTE.NATURE.text": "lorem smdlk fjq lsjdf mqjsh dflkq hs dfhkq g"
}

Does anyone have any idea how I can do this in python?有谁知道我如何在 python 中做到这一点? Thank you so much非常感谢

Sounds like a classic case for recursion;听起来像是递归的经典案例; aggregate path until you reach a "simple" value then write the pair "aggregated path"."key" : "value"聚合路径,直到达到“简单”值,然后写入“聚合路径”对。"key" : "value"

I suggest you use the json Python module to convert the JSON object to a Python object.我建议您使用json Python 模块将 JSON 对象转换为 Python 对象。 Then you can use recursion.然后就可以使用递归了。 If you are using Python 3.5 or later, the following code could be a good starting point:如果您使用的是 Python 3.5 或更高版本,以下代码可能是一个很好的起点:

import json

def flatten_helper(prefix, list_of_dict):
    res = []
    for i in list_of_dict:
        res_dict={}
        for k, v in i.items():
            res_dict['.'.join([prefix,k])]=v
        res.append(res_dict)
    return res

def flatten(x):
    if isinstance(x, list):
        res = []
        for ele in x:
            res = res + flatten(ele)
        return res
    else:
        res = [{}]
        for k, v in x.items():
            if (isinstance(v, dict) or isinstance(v,list)):
                new_res = []
                tempo = flatten(v)
                for r in res:
                    for t in tempo:
                        new_res.append({**r, **t})
                res = flatten_helper(k,new_res)
            else:
                for i, val in enumerate(res):
                    res[i][k]=v
        return res

jsonobj = '{"SECTION": {"ID": 1, "COMMENT" : "foo bar ", "STRUCTURE" : { "LIEN" : [{"from": "2020-01-01", "to": "2020-01-03"}, {"from": "2020-01-04", "to": "2999-01-07" }]}, "CONTEXTE":{"NATURE": {"text": "lorem smdlk fjq lsjdf mqjsh dflkq hs dfhkq g"}}}}'

pyobj = json.loads(jsonobj)
res = flatten(pyobj)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM