【问题标题】:Returning tag value for a key path from a json using dpath.util or anything else使用 dpath.util 或其他任何东西从 json 返回键路径的标记值
【发布时间】:2020-09-07 18:46:13
【问题描述】:

我有这个 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 相关。 我对其他解决方案也没有问题。

【问题讨论】:

  • 推荐你看文档一,pypi.org/project/dpath
  • 我做了,我错过了什么,据我了解,与其他功能相比,得到的东西适合我的需求。

标签: python json data-transform dpath


【解决方案1】:

快速解答 (TL;DR)

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

详细解答

上下文

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

问题

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

解决方案

  • 使用 JMespath 查询和转换任意基于 JSON 的数据结构
  • python dpath 库适用于基于字典的数据结构,但 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']

陷阱

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

  • 通过标准 python 不使用dpathjmespath 也可以实现此结果

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

    ['A1', 'X1']

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多