如何通过嵌套键的值过滤json数组-在python中

5m1hhzi4  于 2022-12-15  发布在  Python
关注(0)|答案(1)|浏览(205)

我正在尝试使用一个数组过滤一个json,这个数组可以有多个对象,但也可以是空的。

输入:

如果一切正常,它就不是空的,并且我的customerKey位于第一级:

"mainArray": [
        {
            "errorsArray": [],
            "errorCode": "0",
                        "customerKey": "UUID-1"
        },
        {
            "errorsArray": [],
            "errorCode": "0",
                        "customerKey": "UUID-2"
        }
    ]

但是当出现错误时,我会把键放到一个嵌套的错误数组中:

"mainArray": [
        {
            "errorsArray": [
                {
                    "customerKey": "UUID-1",
                    "description": "error desc",
                    "errorCode": "1"
                },
                {
                    "customerKey": "UUID-1",
                    "description": "error desc",
                    "errorCode": "2"
                }
            ],
            "errorCode": "1"
        },
        {
            "errorsArray": [],
            "errorCode": "0",
                        "customerKey": "UUID-2"
        }
    ]

输出:

我想过滤我的“mainField”,只留下UUID-1的客户。
一切正常时的预期输出:

"mainArray": [
        {
            "errorsArray": [],
            "errorCode": "0",
                        "customerKey": "UUID-1"
        }
    ]

出现错误时的预期输出:但是当出现错误时,我会把键放到一个嵌套的错误数组中:

"mainArray": [
        {
            "errorsArray": [
                {
                    "customerKey": "UUID-1",
                    "description": "error desc",
                    "errorCode": "1"
                },
                {
                    "customerKey": "UUID-1",
                    "description": "error desc",
                    "errorCode": "2"
                }
            ],
            "errorCode": "1"
        }
    ]

其他信息:

我提到在errorsArray中,除了获得不同的customerKey之外,我不做任何事情。我还提到,此时更改此输入不是一个选项。
谢谢你:)
目前为止我尝试的是:
下面的技术显然只适用于没有错误的情况:

filtered = [obj for obj in mainArray if (obj.get('customerKey',{}) == 'UUID-1')] if len(mainArray ) != 0 else [{}]

当出现错误时,它不起作用,因为customerKey仅位于内部数组中。

vfh0ocws

vfh0ocws1#

您可以使用嵌套列表解析来实现此目的:

mainArray = [
        {
            "errorsArray": [
                {
                    "customerKey": "UUID-1",
                    "description": "error desc",
                    "errorCode": "1"
                },
                {
                    "customerKey": "UUID-1",
                    "description": "error desc",
                    "errorCode": "2"
                }
            ],
            "errorCode": "1"
        },
        {
            "errorsArray": [],
            "errorCode": "0",
                        "customerKey": "UUID-2"
        }
    ]
    
filtered = [x for x in mainArray if [y for y in x["errorsArray"] if y["customerKey"] == "UUID-1"]]

print(filtered)

if in 'x'解析检查'y'(错误)列表是否不为空。2 'y'列表检查UUID。

相关问题