如何从Python中的嵌套json中提取列表项?

时间:2019-12-09 22:04:55

标签: python json

我有一个json对象,正在尝试从嵌套列表中提取几个值。然后在标记中打印它们。我遇到了错误-AttributeError:“列表”对象没有属性“获取”

我知道这是一个列表,我无法执行获取。我已经在寻找合适的方法了几个小时,但我已经精疲力尽了。我可以获取事件,但不能获取Value1和Value2。

这是json对象

{
"resource": {
    "data": {
        "event": "qwertyuiop",
        "eventVersion": "1.05",
        "parameters": {
            "name": "sometext",
            "othername": [
                ""
            ],
            "thing": {
                "something": {
                    "blah": "whatever"
                },
                "abc": "123",
                "def": {
                    "xzy": "value"
                }
            },
            "something": [
                "else"
            ]
        },
        "whatineed": [{
            "value1": "text.i.need",
            "value2": "text.i.need.also"
            }]
        }
    }
}

这是我的功能

def parse_json(json_data: dict) -> Info:
    some_data = json_data.get('resource', {})
    specific_data = some_data.get('data', {})
    whatineed_data = specific_data.get('whatineed', {})

    formatted_json = json.dumps(json_data, indent=2)

    description = f'''
h3. Details
*Event:* {some_data.get('event')}
*Value1:* {whatineed_data('value1')}
*Value2:* {whatineed_data('value2')}
'''

4 个答案:

答案 0 :(得分:0)

从数据结构来看,whatineed是带有单个项目的list,而后者又是一个字典。因此,一种访问方式是:

whatineed_list = specific_data.get('whatineed', [])
whatineed_dict = whatineed_list[0]

您现在可以执行以下操作:

value1 = whatineed_dict.get('value1')
value2 = whatineed_dict.get('value2')

答案 1 :(得分:0)

您可以将功能更改为以下内容:

def parse_json(json_data: dict) -> Info:
    some_data = json_data.get('resource')
    specific_data = some_data.get('data', {})
    whatineed_data = specific_data.get('whatineed', {})

    formatted_json = json.dumps(json_data, indent=2)
    description = '''
h3. Details
*Event:* {}
*Value1:* {}
*Value2:* {}
'''.format(some_data.get('data').get('event'),whatineed_data[0]['value1'], whatineed_data[0]['value2'])

由于whatineed_data是一个列表,因此您需要先索引元素

答案 2 :(得分:0)

Python会将json作为字符串处理,除非它们直接来自文件。这可能是某些问题的根源。另外,this article可能会有帮助。

答案 3 :(得分:0)

假设“ whatineed”属性确实是一个列表,并且它的元素是字典,则不能调用whatineed.get就像它们是属性一样询问Value1或Value2,因为它是一个列表,并且没有属性。

因此,您有两个选择:

  1. 如果whatineed列表曾经只有一个元素,则可以直接访问该元素,而不要访问元素属性:
element = whatineed[0]
v1 = element.get('value1', {})
v2 = element.get('value2', {})
  1. 或者,如果wineeded列表可以包含更多项目,那么,您将需要遍历该列表并访问那些元素:
for element in whatineed:
   v1 = element.get('value1', {})
   v2 = element.get('value2', {})
   ## Do something with values