在python中解析高度嵌套的JSON

时间:2019-01-29 03:58:01

标签: python json python-3.x

我正在通过API连接并提取JSON,但是无法进行解析。

我已经能够解析到以下示例级别。我想从生成的JSON列表中提取“符号”列表,但似乎只能对单个实体执行此操作。如果可能的话,我想直接这样做(即避免只使用循环)。

也就是说,这可行:

data[0]['acct']['positions'][1]['i']['symbol']

返回此:

Out[100]: 'JNC'

但这并没有:

data[0]['acct']['positions'][:]['i']['symbol']

data[0]['acct']['positions'][0:3]['i']['symbol']

均返回以下错误:

Traceback (most recent call last):

  File "<ipython-input-105-72bbee303a08>", line 1, in <module>
    data[0]['securitiesAccount']['positions'][:]['instrument']['symbol']

TypeError: list indices must be integers or slices, not str

下面的示例JSON:

[{'a': 0.0,
  'b': 1.0,      
  'i': {'desc': 'CASH_EQUIVALENT', 'id': '9ZZZFD104', 'symbol': 'MMDA1'},
  'c': 72.64},
 {'a': 0.0,
  'b': 33.61716,      
  'i': {'desc': 'EQUITY', 'id': '78464A417', 'symbol': 'JNC'},
  'c': 39.59},
 {'a': 0.0,
  'b': 87.81473,      
  'i': {'desc': 'EQUITY', 'id': '921937793', 'symbol': 'BVV'},
  'c': 19.34}]

2 个答案:

答案 0 :(得分:3)

这种索引无法像NumPy中那样工作。您可以改用列表理解:

result = [record['i']['symbol'] for record in data[0]['acct']['positions'][0:3]]

很显然,将[0:3]更改为任何值。如果要全部使用,则完全省略该切片。


这是您最初尝试执行的操作:

假设您有一个字典列表,如下所示:

foo = [{'bar': 1}, {'bar': 2}, {'bar': 3}]

如果您想使用自己的方法访问[1, 2, 3],则类似于foo[:]['bar']。但是,此表达式是从左到右求值的,foo[:]只会创建foo的一部分,实际上什么也没做。然后,您尝试从'bar'(列表)中获取密钥foo,这将引发错误。

答案 1 :(得分:2)

您可以使用列表推导来返回过滤后的列表。

代替

data[0]['acct']['positions'][:]['i']['symbol']

您可以使用:

[ i['i']['symbol'] for i in data[0]['acct'] ]

这会循环data[0]['act'],并为每个['i']['symbol']构造一个列表。

对于列表的子部分,您可以使用:

[ i['i']['symbol'] for i in data[0]['acct'][0:3] ]

对此进行修改以与您的示例json一起使用:

data = [
 {'a': 0.0,
  'b': 1.0,      
  'i': {'desc': 'CASH_EQUIVALENT', 'id': '9ZZZFD104', 'symbol': 'MMDA1'},
  'c': 72.64},
 {'a': 0.0,
  'b': 33.61716,      
  'i': {'desc': 'EQUITY', 'id': '78464A417', 'symbol': 'JNC'},
  'c': 39.59},
 {'a': 0.0,
  'b': 87.81473,      
  'i': {'desc': 'EQUITY', 'id': '921937793', 'symbol': 'BVV'},
  'c': 19.34}
 ]
print([ i['i']['symbol'] for i in data[0] ])

打印:

['MMDA1', 'JNC', 'BVV']