(如果存在)从Python 3.6获取结构化JSON中的元素

(if exists) get an element from a structured JSON with Python 3.6

在这个答案中,我理解我可以使用get指令捕获JSON文件的一个元素,如果该元素不存在,则可以获取None。但是我无法理解如何使用多个级别的JSON数据。

让我们看看下面的示例:

1
2
3
import json
json_input = '{"persons": [{"name":"Brian","city":"Seattle"}, {"name":"David","city":"Amsterdam"} ] }'
d = json.loads(json_input)
  • 输入d.get('persons')输出

[{'name': 'Brian', 'city': 'Seattle'}, {'name': 'David',
'city':'Amsterdam'}]

  • 输入d.get('animals')输出

None

但我想用它来检查d['persons'][0]['name']是否存在,或者d['persons'][0]['tel_number']是否存在。如果我使用d.get(['persons'][0]['name']),我会得到以下错误:

Traceback (most recent call last): File"", line 1, in

d.get(['persons'][0]['name']) TypeError: string indices must be integers


正确的方法是:

d.get('persons')[0].get('name')

如果可能的话,字典上应用的get()返回给定键的值。然后我们访问其中的列表,并再次尝试使用名为name的键的get()值。

如果没有列表或没有personsname键,这可能会引发IndexErrorKeyError异常,但您可以使用try .. except块处理,如ibug回答中所述。


这看起来是一个有效的解决方案:

1
2
3
4
5
6
7
def myGet(d, k1, k2, k3):
    try:
        return d[k1][k2][k3]
    except (TypeError, IndexError, KeyError):
        return None

asdfg = myGet(d, 'persons', 0, 'name')

您得到了typeerror,因为python将['persons']视为包含一个字符串而不是索引的列表,所以['persons'][0]得到了'persons',而该字符串不能被另一个字符串索引。