Loading

Python - jsonpath_rw

about

在嵌套结构较深的json数据中,想要获取到嵌套较深的数据非常的麻烦,而jsonpath-rw的思路是将json数据整体当成一个对象,然后通过路径查找的方式去找到指定位置的元素节点,跟xpah类似。
下载

pip install jsonpath_rw==1.4.0
pip install -i https://pypi.doubanio.com/simple jsonpath_rw==1.4.0

以下是简单的示例。

示例

如果Python处理后的json是这样的:

json_data = {
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

我们现在获取store>bicycle>color的值(所有路径都是唯一的,结果也是唯一的):

from jsonpath_rw import parse

# 查找store>bicycle>color
value_path = 'store.bicycle.color'  # jsonpath的路径必须是字符串
js_exe = parse(value_path)
match = js_exe.find(json_data)
# 使用循环取value
print([i.value for i in match])  # red

查找列表中的元素

# 查找store下book列表中的所有category字段
js_exe = parse('store.book.[*].category')   # 'store.book.[*].category' == '$.store.book.[*].category'
# js_exe = parse('$.store.book.[*].category')  # $表示整个json对象
match = js_exe.find(json_data)
print([i.value for i in match])  # ['reference', 'fiction', 'fiction', 'fiction']

# 查找store下book列表中的第二个字典的category字段
js_exe = parse('store.book.[0].category')   # 索引下表从1开始
# js_exe = parse('$.store.book.[0].category')
match = js_exe.find(json_data)
print([i.value for i in match])  # ['fiction']

使用$..来查询

from jsonpath_rw import parse

# 查找store下所有 color 字段,结果唯一
match = parse('$..color').find(json_data)  # $.. 表示查找json对象中的所有的color字段
print([i.value for i in match])  # ['red']

# 查找store下所有 category 字段,结果不唯一
match = parse('$..category').find(json_data)
print([i.value for i in match])  # ['reference', 'fiction', 'fiction', 'fiction']

注意,这里其实借助了很多jsonpath的用法,要记住jsonpath-rw用法可以参考jsonpath的用法。
有关路径的更多处理操作参考:https://github.com/json-path/JsonPath
再次强调,我们参考的是JsonPath,但是我们用的是jsonpath-rw库。


see also:

JsonPath教程 | PYPI jsonpath-rw | github jsonpath

posted @ 2020-04-28 08:24  听雨危楼  阅读(355)  评论(0编辑  收藏  举报