Python条件从dict获取价值吗?

时间:2018-07-27 03:19:12

标签: python python-3.x dictionary

给出此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元素之外还没有其他元素,因此metacode元素可能存在也可能不存在。 datatrackingid可能也可能不存在。

问题是,如果元素都存在,如何提取id的值。如果缺少任何元素,则id的值应为None

3 个答案:

答案 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更容易。我正在特别检查以确保codeint,但是您可以根据需要进行更改。如果还有其他原因,则必须进行调整。有几种不同的解决方案,这实际上是您觉得最舒适的操作和维护方法。

答案 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。