Python условно получить значение из dict?

1

Учитывая эту строку 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

  • 2
    что такое строка Python JSON ?
  • 0
    sry - я исправил фразу.
Теги:
python-3.x
dictionary

3 ответа

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 в Python

  • 0
    Потому что это чище, а также потому, что это встроенный метод, который не вызывает исключений. См. Docs.quantifiedcode.com/python-anti-patterns/correctness/… . Кроме того, что вы подразумеваете под значимым результатом?
  • 1
    Похоже, Безумный Ученый критикует и осуждает других.
Показать ещё 7 комментариев
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, но вы можете изменить его так, как хотите. Если это могут быть другие вещи, вам придется их корректировать. Есть несколько различных решений для этого, это действительно то, что вы чувствуете, наиболее комфортно делать и поддерживать.

  • 1
    Что если ключ есть, но не равен 4003?
  • 0
    Гм! Я забыл прочитать весь вопрос, упс! Я обновлю это :)
0

Вы можете добавить проверку на основные ошибки для всей операции:

def get_id(j)
    try:
        if j['error']['meta]['code'] == 4003:
            return j['error']['data']['tracking']['id']
    except KeyError:
        pass
    return None

Если какой-либо элемент отсутствует, эта функция будет тихо возвращать None. Если все необходимые элементы присутствуют, он вернет требуемый идентификатор. Единственный раз, когда он действительно может потерпеть неудачу, - это если один из промежуточных ключей не ссылается на словарь. Это может привести к возникновению TypeError.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню