Учитывая эту строку json, как я могу вытащить значение id
если code
равен 4003?
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
В словаре 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 в Python
Я бы 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
, но вы можете изменить его так, как хотите. Если это могут быть другие вещи, вам придется их корректировать. Есть несколько различных решений для этого, это действительно то, что вы чувствуете, наиболее комфортно делать и поддерживать.
Вы можете добавить проверку на основные ошибки для всей операции:
def get_id(j)
try:
if j['error']['meta]['code'] == 4003:
return j['error']['data']['tracking']['id']
except KeyError:
pass
return None
Если какой-либо элемент отсутствует, эта функция будет тихо возвращать None. Если все необходимые элементы присутствуют, он вернет требуемый идентификатор. Единственный раз, когда он действительно может потерпеть неудачу, - это если один из промежуточных ключей не ссылается на словарь. Это может привести к возникновению TypeError.