代码之家  ›  专栏  ›  技术社区  ›  Chris

在python中解析嵌套严重的JSON

  •  1
  • Chris  · 技术社区  · 7 年前

    我已经能够解析到下面包含的示例级别。我想从生成的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
    

    [{'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 回复  |  直到 7 年前
        1
  •  3
  •   iz_    7 年前

    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' ,将引发错误的列表。

        2
  •  2
  •   Kim    7 年前

    您可以使用列表理解返回筛选后的列表。

    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] ]
    

    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']