问答 关于获取 json 的某一 list 的某些字段问题

叶子 · 2017年10月13日 · 最后由 叶子 回复于 2017年10月13日 · 2495 次阅读

在以下的 json 中,我需要得到的几个字段是:当 set.class.0 非空的时候,返回该 set 列表中的某些字段
{
"code": 0,
"msg": null,
"data": {
"set": [
{
"id": "1566", "type": 1,
"class": { "0": [],"1": [ "460"],"2": ["460","460","461" ] },
},
{
"id": "1788", "type": 1,
"class": { "0": [ "461" ], "1": [], "2": [ "460" ]},
},
{
"id": "1762","type": 1,
"class": { "0": [],"1": [ "461" ], "2": [ "460" ],
},
{
"id": "1790","type": 1,
"class": { "0": [ "460","461"], "1": [], "2": [] },
},
{
"id": "1792","type": 2,
"class": {"0": [ "460", "461"], "1": [],"2": []
},
},]
}}

既是当存在"0": [ "461" ] 与"0": [ "460", "461"] 等” 0“为非空内容时,取 set[0] 中的 id,type 与” 0"的属性值,在此例子中,则是得到 id=1788,type=1,"0"=461。我用 jsonpath 仅仅是实现了当 set.class.0 非空的时候,返回整个 set:
List<Object> list=JsonPath.read(string, "$.data.set[?(@.class.0.length()>0]");
得到的结果是
{
"id": "1788", "type": 1,
"class": { "0": [ "461" ], "1": [], "2": [ "460" ]},
},
{
"id": "1790","type": 1,
"class": { "0": [ "460","461"], "1": [], "2": [] },
},
{
"id": "1792","type": 2,
"class": {"0": [ "460", "461"], "1": [],"2": []},
}

疑问:若有使用过 jsonpath 的人,可否回答下 jsonpath 是否还可以对已筛选的出的内容再次做检索。或者是还有其他的处理方法。非常感谢!

共收到 9 条回复 时间 点赞

求回复~

叶子 回复

用 for in 遍历。。。试试?

YYC 回复

这。。。估计需要很多行代码。。。。有思路提供吗?

没明白,你这应该是已经截取了一个新的串,直接处理就好了吧

叶子 回复

emmm.....感觉用 jsonpath 直接对已筛选出来的结果做处理就行了。。。不需要遍历。。。

49875183 回复

得到的新的是一个 list,因其数据类型没有定义成某个实体类,不知如何取里面的字段。或者你有推荐的处理方法吗?
另外,我通过使用 List<Object> list=JsonPath.read(string, "$.data..[?(@.class.0.length()>0)].id 拿到了符合条件的所有 id,这也算是一种处理方法了吧,只不过要拿其他字段的时候,需要再这么写一行,得再定义多个 list...有点麻烦。

YYC 回复

已经筛选的结果是 list,用 list.get(0)的时候,输出的结果因为丢失了原本的双引号,使用 jsonpath 再处理的时候便报错了。我应该顺便再问多一个,转义问题,怎么保留原本的双引号。(已经试了网上一堆不靠谱的用法)

叶子 回复

所以问题来了,你到底要的是啥,id 的集合还是 class 的集合,还是说可以把 id,class 做成一个 map 呢?

只要一个符合条件的 id,type,“0” 抱歉描述欠缺 😵

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册