Python 从嵌套的JSON数据中获取特定值
我使用以下代码获取日志条目,例如: 2020-01-11 17:47:16[根目录]信息:与电子邮件的联系人 hunter@tomorrowworld.com已经存在 我想知道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
.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'))