Решить JSON данные python разбор плоской - PullRequest
0 голосов
/ 04 марта 2020

Прошло много времени с тех пор, как я застрял на предмете, по которому я не могу найти нужное решение.

Пример : мне дано 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"
            }
        }

    }
}

Я хотел бы получить вывод, например:

{
    "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"
}

Кто-нибудь знает, как я могу сделать это в python? Большое вам спасибо

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Я предлагаю вам использовать модуль json Python для преобразования объекта JSON в объект Python. Тогда вы можете использовать рекурсию. Если вы используете 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)
0 голосов
/ 04 марта 2020

Звучит как классический c случай для рекурсии; Совокупный путь, пока вы не достигнете «простого» значения, затем напишите пару «Совокупный путь». «Ключ»: «Значение»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...