Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从嵌套的JSON数据中获取特定值_Python_Json - Fatal编程技术网

Python 从嵌套的JSON数据中获取特定值

Python 从嵌套的JSON数据中获取特定值,python,json,Python,Json,我使用以下代码获取日志条目,例如: 2020-01-11 17:47:16[根目录]信息:与电子邮件的联系人 hunter@tomorrowworld.com已经存在 我想知道.get(“errors”,{})[0].get('message')是不是解决这个问题的正确方法 if r.status_code != 200: if r.json().get("error") == "CONTACT_EXISTS": logging.info(r.json().get("er

我使用以下代码获取日志条目,例如:

2020-01-11 17:47:16[根目录]信息:与电子邮件的联系人 hunter@tomorrowworld.com已经存在

我想知道
.get(“errors”,{})[0].get('message')
是不是解决这个问题的正确方法

if r.status_code != 200:
    if r.json().get("error") == "CONTACT_EXISTS":
        logging.info(r.json().get("errors", {})[0].get('message'))
完整的JSON响应:

{
    "category": "OBJECT_ALREADY_EXISTS",
    "correlationId": "4a3bf3a8-72c4-47ed-ac27-520ca0bac128",
    "error": "CONTACT_EXISTS",
    "errors": [
        {
            "in": "email",
            "message": "A contact with email hunter@website.org already exists."
        }
    ],
    "identityProfile": {
        "identity": [
            {
                "isPrimary": true,
                "timestamp": 1578760232183,
                "type": "EMAIL",
                "value": "hunter@website.org"
            },
            {
                "timestamp": 1578760232205,
                "type": "LEAD_GUID",
                "value": "79b14936-1215-454a-939d-42071b036bfb"
            }
        ],
        "isContact": true,
        "linkedVid": [],
        "savedAtTimestamp": 1578760232210,
        "vid": 125401
    },
    "message": "Contact already exists",
    "requestId": "2243a2d1ddd19d466ea4b98ab5cf6d66",
    "status": "error"
}

您应该将
[{}]
作为默认的
错误
值,以避免
索引器

您还可以提取
json()
result来两次不解析响应内容:

if r.status_code != 200:
    content = r.json()
    if content.get("error") == "CONTACT_EXISTS":
        logging.info(content.get("errors", [{}])[0].get("message"))

在这个
r.json().get(“errors”,{})[0].get('message')
中使用get方法没有多大意义。特别是使用
{}
默认值。如果没有
错误
元素,并且您尝试从中索引第0个元素,则无论哪种方式都会得到错误

如果可以确保每个元素都存在,请使用普通索引
r.json()

如果你不能-在每一步都使用
.get()

我看到并想知道的唯一“问题”是,如果由于某种原因导致的
错误不存在,那么回退就是
{}
。但是[0]会导致错误吗?我认为这样做不安全,json=r.json(),更安全的做法是调用其他名称。这不是正确的方法,因为“errors”是一个列表,而不是dict。此外,如果列表为空,它将引发一个
索引器
。你是对的,我已经更新了我的答案。我已将变量重命名为
content
。如果您没有导入
json
模块,那么使用
json
作为变量名是没有危险的(尽管您可能希望使用不同的名称,以免有人认为导入了
json
模块)。
if r.status_code != 200:
    if r.json().get("error") == "CONTACT_EXISTS":
        default=[{'message':'key does not exit'}]
        logging.info(r.json().get("errors", default)[0].get('message'))