Python 解析嵌套的JSON键并以CSV格式获取值

Python 解析嵌套的JSON键并以CSV格式获取值,python,json,jq,Python,Json,Jq,我有一个类似这样的嵌套JSON数据,大约有5000条记录 { "data": { "attributes": [ { "alert_type": "download", "severity_level": "med", "user": "10.1.1.16" }, { "al

我有一个类似这样的嵌套JSON数据,大约有5000条记录

{
    "data": {
        "attributes": [
            {
                "alert_type": "download",
                "severity_level": "med",
                "user": "10.1.1.16"
            },
            {
                "alert_type": "download",
                "severity_level": "low",
                "user": "10.2.1.18"
            }
        ]
    }
}
现在,我需要解析这个JSON并只获取
CSV
格式的特定字段。我们需要CSV格式的
警报类型
&
用户

我试图解析这个JSON字典:

导入json >>>resp='{“数据”:{“属性”:[{“警报类型”:“下载”,“严重性级别”:“med”,“用户”:“10.1.1.16”},{“警报类型”:“下载”,“严重性级别”:“低”,“用户”:“10.2.1.18”}}” >>>user_dict=json.loads(resp) >>>事件\u cnt=用户\u dict['data']['attributes'] >>>打印事件\u cnt[0]['alert\u type'] 下载 >>>打印事件\u cnt[0][“用户”] 10.1.1.16 >>>打印事件\u cnt[0]['alert\u type']+',“+事件\u cnt[0]['user'] 下载,10.1.1.16 >>> 如何以CSV格式在一次迭代中获取特定
键的所有元素/

输出:

下载,10.1.1.16
下载,10.2.1.18
由于
{“数据”:{“属性”:
是一个列表,您可以在其上循环并打印所需键的值(
d
是用户指令):

由于
{“data”:{“attributes”:
是一个列表,您可以在其上循环并打印所需键的值(
d
是用户指令):


您可以让它有点像这样的数据驱动:

import json

DESIRED_KEYS = 'alert_type', 'user'

resp = '''{ "data": {
                "attributes": [
                    {
                        "alert_type": "download",
                        "severity_level": "med",
                        "user": "10.1.1.16"
                    },
                    {
                        "alert_type": "download",
                        "severity_level": "low",
                        "user": "10.2.1.18"
                    }
                ]
            }
          }
       '''

user_dict = json.loads(resp)

for attribute in user_dict['data']['attributes']:
    print(','.join(attribute[key] for key in DESIRED_KEYS))
要处理没有所有键的属性,您可以将其用作最后一行,这将为缺少的值分配一个默认值(如图所示的空白字符串),而不是导致异常

    print(','.join(attribute.get(key, '') for key in DESIRED_KEYS))

您可以让它有点像这样的数据驱动:

import json

DESIRED_KEYS = 'alert_type', 'user'

resp = '''{ "data": {
                "attributes": [
                    {
                        "alert_type": "download",
                        "severity_level": "med",
                        "user": "10.1.1.16"
                    },
                    {
                        "alert_type": "download",
                        "severity_level": "low",
                        "user": "10.2.1.18"
                    }
                ]
            }
          }
       '''

user_dict = json.loads(resp)

for attribute in user_dict['data']['attributes']:
    print(','.join(attribute[key] for key in DESIRED_KEYS))
要处理没有所有键的属性,您可以将其用作最后一行,这将为缺少的值分配一个默认值(如图所示的空白字符串),而不是导致异常

    print(','.join(attribute.get(key, '') for key in DESIRED_KEYS))

简单列表理解:

>>> jdict=json.loads(resp)
>>> ["{},{}".format(d["alert_type"],d["user"]) for d in jdict["data"]["attributes"]]
['download,10.1.1.16', 'download,10.2.1.18']
您可以加入其中以获得所需的输出:

>>> li=["{},{}".format(d["alert_type"],d["user"]) for d in jdict["data"]["attributes"]]
>>> print '\n'.join(li)
download,10.1.1.16
download,10.2.1.18

简单列表理解:

>>> jdict=json.loads(resp)
>>> ["{},{}".format(d["alert_type"],d["user"]) for d in jdict["data"]["attributes"]]
['download,10.1.1.16', 'download,10.2.1.18']
您可以加入其中以获得所需的输出:

>>> li=["{},{}".format(d["alert_type"],d["user"]) for d in jdict["data"]["attributes"]]
>>> print '\n'.join(li)
download,10.1.1.16
download,10.2.1.18
使用,单线解决方案非常简单:

$ jq -r '.data.attributes[] | [.alert_type, .user] | @csv' input.json
"download","10.1.1.16"
"download","10.2.1.18"
如果不希望字符串被引用,请使用
join(“,”)
而不是
@csv

使用,一行解决方案非常简单:

$ jq -r '.data.attributes[] | [.alert_type, .user] | @csv' input.json
"download","10.1.1.16"
"download","10.2.1.18"

如果不希望字符串被引用,请使用
join(“,”)
而不是
@csv

感谢Peak。使用jq,是的,这是可能的。我已经知道方法,但这应该是一种python方法。不过,我将在python函数中包含此逻辑。pip install jq#有关详细信息,请参阅;pip install pyjq#有关详细信息,请参阅感谢Peak。使用jq,是的,这是可能的。我已经知道方法,但这是可能的应该是pythonic方式。不过我将在python函数中包含此逻辑。pip install jq#有关详细信息,请参阅;pip install pyjq#有关详细信息,请参阅