【问题标题】:Handling/Parsing complex nested JSON in Python在 Python 中处理/解析复杂的嵌套 JSON
【发布时间】:2019-06-11 05:38:02
【问题描述】:

使用python,尝试解析字典中的每个键值。我能够解析键值,其中值又是另一个字典。但是我现在被困在解析该内部字典中的列表的地方。下面是 JSON 结构。

json_struct = {
    "Name":"John",
    "Age":"30",
    "State":"NC",
    "xxxx":{
        "xxxx1":"1111111",
        "xxxx2":"222222",
        "xxxx3":[
            {
                "aaa1": "333",
                "aaa2":"444"
            },
            {
                "bbb1": "555",
                "bbb2":"666"
            }
        ]
    }
}

进行迭代的代码片段:

def check1(json_struct):
    for k, v in json_struct.items():
        if isinstance(v, OrderedDict):
            check1(v)
        else:
            print "{0} : {1}".format(k, v)

实际输出:

Name:John
Age:30
state:NC
xxxx1:1111111
xxxx2:222222
xxxx3:[('aaa1','333'), ('aaa2':'444'), ('bbb1:555'), ('bbb2:666')]

预期输出:

Name:John
Age:30
state:NC
xxxx1:1111111
xxxx2:222222
aaa1:333
aaa2:444
bbb1:555
bbb2:666

我缺少一些可以遍历列表的东西,但我也尝试了 isinstance 和 if 中的列表,但我得到的结果仍然不正确。

对此的任何知识分享都将受到高度赞赏。

提前致谢!

【问题讨论】:

    标签: python json parsing dictionary ordereddictionary


    【解决方案1】:

    有两个问题:

    • 您正在检查 OrderedDict 类型,但这可能特定于您使用的 Python 版本;在 Python 3.x 上,您将改为检查 dict;

    • aaa1 和类似值位于列表中,位于 [] 之间,这就是您所看到的输出。

    这也是你要检查的:

    def check1(json_struct):
        for k, v in json_struct.items():
            if isinstance(v, OrderedDict):
                check1(v)
            elif isinstance(v, list):
                for e in v:
                    check1(e)
            else:
                print "{0} : {1}".format(k, v)
    

    在使用 Python 3 版本时,您可能需要 dict 而不是 OrderedDict。

    【讨论】:

    • 我使用的是 Python 2.7。而OrderedDict的原因是为了维护类似于JSON中key/value的顺序。使用dict,更改结果集中的顺序。但是是的,当我使用 dict 时,它可以正常工作,但只是顺序发生了变化。另一个快速的问题,当遍历 dict 中的列表时,有一些 unicode 值(不是键/值)。即{'"a":{"b":["0","1"]}}。这会导致错误“AttributeError:'unicode' object has no attribute 'items”。试图找到一个特定的函数或检查来处理这种情况。
    • 你需要使用 Python 2 吗?因为在 Python 3 中使用 Unicode 很多 更简单,并且您的代码可能很容易更新以与 Python 3 一起使用。如果您确实需要 Python 2,我不明白您的示例,它似乎缺少 ' 并且错误消息似乎表明您传入的 json_struct 是 Unicode 字符串 unicode,而不是OrderedDict?
    • 是的,格里斯玛!对于这个用例,我将坚持使用 2.7。忽略前面的例子,考虑下面的{ "X":"Text1", "Y":"Text2", "a":{ "b":["0","1"] } } X 和 Y 被解析,但是当它涉及到 b 时,代码失败并显示“AttributeError: 'unicode' object has no attribute 'items”。我也试过这个,只是为了检查代码的行为,(不确定它是否有任何区别){ "X":"Text1", "Y":"Text2", "b":["0","1"] }这是同样的错误。但现在它立即失败了。不通过 X 和 Y 解析。
    • 没有属性items 的错误是因为传入的不是dict(或OrderedDict)。在您的情况下,您似乎正在传递一个 Unicode 字符串。您能否使用具有此行为的明确示例更新您的原始问题?因为从你所说的和我提供的代码来看,我无法重现你的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 2021-09-23
    • 2017-05-21
    • 2020-08-14
    • 2021-03-17
    • 2021-05-22
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多