关于jsonpath.jsonpath()中引入变量

因为json中重复的关键字都是重复的```json
“item”:[
{
“school_id”:”935”,
“level1_name”:”专科”,
“zslx_name”:”普通类”
},
{
“school_id”:”934”,
“level1_name”:”本科”,
“zslx_name”:”特殊类”
}

我就想着在jsonpath.jsonpath()中引入变量。
```python
        for m in range(1, 3):
            school_id = jsonpath.jsonpath(data, '$..item[{}].school_id'.format(m))
            level1_name = jsonpath.jsonpath(data, '$..item[{}].level1_name'.format(m))

但是不成功,不知道大家有什么解决的办法没?

pardon110
最佳答案

查看jsonpath方法原型如下 ,它返回一个列表或布尔值(失败,False)。所以没必要迭代

jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True) -> Union[list, bool]

很明显第一个参数是py对象(非字符串类型),第二个参数是类似于xpath的查询语句,查阅读 [官方文档] (goessner.net/articles/JsonPath/) 可有如下查询方式

获取item前两项

rs = jsonpath.jsonpath(jsonObj, "$..item[:2]")
# [{'school_id': 935, 'level1_name': '专科', 'zslx_name': '普通类'}, {'school_id': 934, 'level1_name': '本科', 'zslx_name': '特殊类'}]

直接过滤拉取特定键

rs = jsonpath.jsonpath(jsonObj, "$..[school_id,level1_name]")
# [935, '专科', 934, '本科', 937, '研究生']

print([{k:v}for k,v in zip(rs[0::2],rs[1::2])])
#[{935: '专科'}, {934: '本科'}, {937: '研究生'}]
3年前 评论
chuanqi3 (楼主) 3年前
讨论数量: 2
pardon110

查看jsonpath方法原型如下 ,它返回一个列表或布尔值(失败,False)。所以没必要迭代

jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True) -> Union[list, bool]

很明显第一个参数是py对象(非字符串类型),第二个参数是类似于xpath的查询语句,查阅读 [官方文档] (goessner.net/articles/JsonPath/) 可有如下查询方式

获取item前两项

rs = jsonpath.jsonpath(jsonObj, "$..item[:2]")
# [{'school_id': 935, 'level1_name': '专科', 'zslx_name': '普通类'}, {'school_id': 934, 'level1_name': '本科', 'zslx_name': '特殊类'}]

直接过滤拉取特定键

rs = jsonpath.jsonpath(jsonObj, "$..[school_id,level1_name]")
# [935, '专科', 934, '本科', 937, '研究生']

print([{k:v}for k,v in zip(rs[0::2],rs[1::2])])
#[{935: '专科'}, {934: '本科'}, {937: '研究生'}]
3年前 评论
chuanqi3 (楼主) 3年前

@pardon110 大神 我主要是想换行输出,类似下面这样的。 935,专科,普通类 934,本科,特殊类

不知道怎么实现比较好? :sweat_smile:

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!