【问题标题】:Get JSON path even for tabular in Python甚至为 Python 中的表格获取 JSON 路径
【发布时间】:2022-07-11 23:13:11
【问题描述】:

在 Python 中,我想获取 json 文件的所有路径,甚至是表的路径。

所以我会为这个 JSON 路径:

{
    "objetname": {
        "lala": [
            {
                "type": "thetype",
                "infos": {
                    "info1": 24,
                    "info2": "blablabla"
                }
            }
        ],
        "id": "521",
        "titi": "02",
        "booking": "2022-06-21",
        "idbis": "123456789",
        "type": "OP",
        "toto": "0006"
    }
}

输出中的这些路径:

objetname.lala.type
objetname.lala.infos.info1
objetname.lala.infos.info2
objetname.id
objetname.titi
objetname.booking
objetname.idbis
objetname.type
objetname.toto

我该怎么办?

实际上我想在字典中检索,键中的 jsonpath 和值中的 NULL 除了在数组的情况下,我希望在值中具有数组中的路径,例如:

'objetname.lala': (['type', 'infos.info1', 'infos.info2'],1,1),
'objetname.id': ('NULL', 0, 0),
'objetname.titi': ('NULL', 0, 0),
'objetname.booking': ('NULL', 0, 0),
'objetname.idbis': ('NULL', 0, 0),
'objetname.type': ('NULL', 0, 0),
'objetname.toto': ('NULL',0, 0)

这是我的代码:

import re

mydict = {}
all_keys = []
acc = 0
for key, value in df_json.iloc[0].iteritems():
    if (value is not None): #or (value!='NULL') or (value!=np.nan):
        mydict[key] = 'NULL', 0, 0
        depth = depthCount(value)
        if isinstance(value, list):
            tab = list(dict.fromkeys(value[0], 0).keys())
            # Case no key:value where key is not fix or string only then ARRAY_LEVEL=99
            if len(tab[0])==1:
                mydict[key] = 'NULL', 99, 0
            elif depth==1:
                acc += 1
                mydict[key] = tab, 1, acc

【问题讨论】:

    标签: python json jsonpath


    【解决方案1】:

    不是最好的方法,但它有效:

    def dict_to_str(p_key):
        if not isinstance(p_key, dict):
            return p_key
        names = []
        for k, val in p_key.items():
            if isinstance(val, dict):
                names += [k + "." + x for x in dict_to_str(val)]
            elif isinstance(val, list):
                for sub_val in val:
                    names += [k + "." + x for x in dict_to_str(sub_val)]
            else:
                names.append(k)
        return names
    

    【讨论】:

    • 嗨@Roomm,非常感谢您的回答。我只是重新表述了我的问题。你能看一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多