0

我有这个 json :

 json_data = json.loads("""
{
    "result":{         
        "statistics": [
                        {
                            "name": "A1",
                            "year": 1994,
                            "award": "Y1"
                        },
                        {
                            "name": "X1",
                            "year": 1990,
                            "award": "Y55"
                        }
                    ]
            }
}""")

我正在尝试使用 dpath.util.get 获取 json 中每次出现“名称”的所有值,以获得关键路径

print(dpath.util.get(json_data, 'result/statistics/name', separator= '/'))

运行后出现此错误:

        raise KeyError(glob)
KeyError: 'result/statistics/name'

预期结果:

{'name' : '['A1','X1']'}

我正在尝试这样做,因为 json 可以更改,并且该路径始终与特定的 json 相关。我对其他解决方案也没有问题。

4

1 回答 1

0

快速回答 (TL;DR)

  • JMespath 允许在 python 3.x 中查询任意基于 JSON 的数据结构
  • python dpath 可能并不总是有效,因为基于 JSON 的数据可以包含字典(又名对象)和列表类型
  • 标准python足以获得所需的结果

详细解答

语境

  • 蟒蛇3.x
  • 查询和转换任意 JSON 数据结构

问题

  • 场景: UserJerryC 希望使用 python 查询一个 JSON 数据结构dpath
    • dpath尝试查询时产生错误消息
    • UserJerryC 愿意使用除此之外的其他解决方案dpath
    • 假设 UserJerryC 有理由不使用标准 python 功能来访问数据

解决方案

  • 使用 JMespath 查询和转换任意基于 JSON 的数据结构
  • pythondpath库适用于基于字典的数据结构,但 JSON 可以包含的不仅仅是字典(又名对象、又名映射、又名关联数组)

例子

  • 演示 JMespath 查询的 python 3.6 代码

      导入json
      导入 jmespath
      经过
      json_data = json.loads("""
      {
        “结果”: {
          “统计数据”: [
            {
              “奖”:“Y1”,
              “名称”:“A1”,
              “年”:1994
            },
            {
              “奖”:“Y55”,
              “名称”:“X1”,
              “年份”:1990
            }
          ]
        }
      }""")
      经过
      myquery = """result.statistics|[*].name"""
      vg77result = jmespath.compile(myquery).search(json_data)
      print(vg77result) ## => ['A1', 'X1']
      经过
      

    ['A1','X1']

陷阱

  • 这种方法需要安装 pythonjmespath模块,dpath它不是核心 python 3.x 的一部分

  • dpath无需使用或jmespath通过标准 python ,此结果是可能的

      """注意——上面的结果也可以用标准的python得到"""
      vg99result = [ row.get('name') for row in json_data['result']['statistics'] ]
      print(vg99result) ## => ['A1', 'X1']
      经过
    

    ['A1','X1']

也可以看看

于 2021-06-09T08:22:52.357 回答