【问题标题】:Python3 - Parse list of strings inside nested jsonPython3 - 解析嵌套 json 中的字符串列表
【发布时间】:2020-08-15 19:01:27
【问题描述】:

这里是 Python 菜鸟。我看到了许多类似的问题,但没有一个是我的确切用例。我有一个简单的嵌套 json,我正在尝试访问存在于 metadata 中的元素 name。下面是我的示例 json。

{
    "items": [{
            "metadata": {
                "name": "myname1"
            }
        },
        {
            "metadata": {
                "name": "myname1"
            }
        }
    ]
}

下面是我目前尝试过的代码,但没有成功。

import json
f = open('./myfile.json')
x = f.read()
data = json.loads(x)
for i in data['items']:
    for j in i['metadata']:
            print (j['name'])

下面的错误提示

文件“pythonjson.py”,第 8 行,在 print (j['name']) TypeError: string indices must be integers

当我打印 print (type(j)) 时,我收到了以下 o/p <class 'str'>。所以我可以看到它是一个字符串列表而不是字典。那么现在如何解析字符串列表?任何官方文档或指南都会对了解这个概念有很大帮助。

【问题讨论】:

  • 尝试把嵌套​​元素也转成json --> print(json.loads(j)['name']
  • 提供的JSON 无效。此外,您可能在第一个 for 循环中需要 print(item['metadata']['name'])。不需要第二个循环。
  • 你的 json 无效
  • 除了缺少: 之外,嵌套的JSON 类似于{"foo": "{\"bar\": 5}"},其中foo 键的值本身可以被解码。你所拥有的只是一个“普通”的 JSON 对象,当它被解码时,会以你用来解码它的任何语言生成一个嵌套的数据结构。
  • 很抱歉发布了无效的 Json。现在已经更正了。

标签: python json list python-3.7


【解决方案1】:

你的 json 不好,python 异常很清楚,没有歧义。您有基本字符串“名称”,并且您正在尝试...对其进行查找?

让我们切掉所有的 json,看看真正的问题。你不知道如何迭代一个字典。您实际上是在迭代键本身。如果你也想查看它们的值,你将需要 dict.items()

https://docs.python.org/3/tutorial/datastructures.html#looping-techniques

metadata = {"name": "myname1"}
for key, value in metadata.items():
    if key == "name":
        print ('the name is', value)

但是,如果您已经知道要查找的密钥,为什么还要麻烦呢? 这就是为什么我们有 dict。

print ('the name is', metadata["name"])

【讨论】:

  • 我曾经像在 boto3(AWS Python SDK)问题中那样遍历 dict 对象,并且我也能够访问这些值而没有任何问题。所以我认为我做的事情是正确的,但你的回复更有意义。将不得不重新审视我的 python 基础知识。对不起,json。现已更正。
  • 如果您使用该代码,您只是在遍历键。但这并没有改变您可以使用这些键来查找它们的值的事实,所以就是这样。
  • 纠正我如果我错了,我从中学到了一件事。每当我到达字典中的字符串对象时,就该停止迭代了,我可以直接调用它们。对吗?
  • 如果您已经知道要查找的密钥,请不要重复查找。直接用就行了。 (如果您担心它不在其中,请检查或处理它,不要重复)
  • 但是是的,你“可以”迭代找到它。但这是低效的,可能会造成严重后果——稍后您将学习大 O 表示法。
【解决方案2】:

您可能需要:

import json
f = open('./myfile.json')
x = f.read()
data = json.loads(x)
for item in data['items']:
    print(item["metadata"]["name"]

您原来的JSON 无效(缺少冒号)。

【讨论】:

  • 抱歉,Json 现已更正。来到解决方案,所以当我们在 json(或字典)中点击字符串时,我们不应该进一步迭代,对吧?我们应该直接访问它们吗?我的理解正确吗?
【解决方案3】:

要访问名称的内容,请使用 "i["metadata"].keys()" 这将返回 "metadata" 中的所有键。

访问“元数据”中字典所有值的工作代码。

for i in data['items']:
    for j in i["metadata"].keys():
        print (i["metadata"][j])

**更新:**仅访问“名称”内容的工作代码。

for i in data['items']:
        print (i["metadata"]["name"])

【讨论】:

  • 好方法!这将解决这个问题。但当metadata 中有多个键时,不会产生预期的输出。我猜它需要稍微调整一下。
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多