给出此json字符串,如果id
等于4003,我该如何提取code
的值?
error_json = '''{
'error': {
'meta': {
'code': 4003,
'message': 'Tracking already exists.',
'type': 'BadRequest'
},
'data': {
'tracking': {
'slug': 'fedex',
'tracking_number': '442783308929',
'id': '5b59ea69a9335baf0b5befcf',
'created_at': '2018-07-26T15:36:09+00:00'
}
}
}
}'''
我不能假设除了error
元素之外还没有其他元素,因此meta
和code
元素可能存在也可能不存在。 data
,tracking
和id
可能也可能不存在。
问题是,如果元素都存在,如何提取id
的值。如果缺少任何元素,则id
的值应为None
答案 0 :(得分:4)
python字典具有get(key, default)
方法,该方法支持在未找到键的情况下返回默认值。您可以将空字典链接到嵌套元素。
# use get method to access keys without raising exceptions
# see https://docs.quantifiedcode.com/python-anti-patterns/correctness/not_using_get_to_return_a_default_value_from_a_dictionary.html
code = error_json.get('error', {}).get('meta', {}).get('code', None)
if code == 4003:
# change id with _id to avoid overriding builtin methods
# see https://docs.quantifiedcode.com/python-anti-patterns/correctness/assigning_to_builtin.html
_id = error_json.get('error', {}).get('data', {}).get('tracking', {}).get('id', None)
现在,给定一个看起来像JSON的字符串,您可以使用json.loads()
将其解析为字典,如Parse JSON in Python
答案 1 :(得分:2)
我会try
:
import json
error_json = '''{
"error": {
"meta": {
"code": 4003,
"message": "Tracking already exists.",
"type": "BadRequest"
},
"data": {
"tracking": {
"slug": "fedex",
"tracking_number": "442783308929",
"id": "5b59ea69a9335baf0b5befcf",
"created_at": "2018-07-26T15:36:09+00:00"
}
}
}
}'''
parsed_json = json.loads(error_json)
try:
if parsed_json["error"]["meta"]["code"] == int(parsed_json["error"]["meta"]["code"]):
print(str(parsed_json["error"]["data"]["tracking"]["id"]))
except:
print("no soup for you")
输出:
5b59ea69a9335baf0b5befcf
很多python似乎最好是请求宽恕而不是允许。您可以 查找字典中的那个键是否存在,但是实际上try
更容易。我正在特别检查以确保code
是int
,但是您可以根据需要进行更改。如果还有其他原因,则必须进行调整。有几种不同的解决方案,这实际上是您觉得最舒适的操作和维护方法。
答案 2 :(得分:0)
您可以在整个操作中添加关键错误检查:
def get_id(j)
try:
if j['error']['meta’]['code'] == 4003:
return j['error']['data']['tracking']['id']
except KeyError:
pass
return None
如果缺少任何元素,此函数将安静地返回None。如果所有必需的元素都存在,它将返回所需的ID。它唯一真正失败的时间是中间键之一不引用字典。这可能会导致TypeError。