[alibaba/fastjson]JSONPath.paths的结果感觉有点问题

2025-11-11 133 views
3

你好! 在使用fastjson的JSONPath时,发现如下问题:

1、有一个类Person,

static class Person{

private String name;

private String id;

 //get set...
}

2、实例化该类后将id和name的值设置为同一个值,假设值都设置为“id”,而后用JSONPath.paths(Object obj)解析该实例,如下。得到的path只有"/"和"/id",没有"/name"。个人觉得得到的path不应该是"/"、"/id"、"/name"吗?

Person person = new Person();

person.setId("id");

person.setName("id");

Map<String, Object> pathValues = JSONPath.paths(person);

Set<String> paths = pathValues.keySet();

for (String path : paths) {

    LOG.info(path);
}

debug下了源码,里面用于用到的是一个Map<Object,String>,根据该map是否含有key来判断是否属于结果集。而对于上面的情况,由于id和name的值都是"id",所以处理了id属性之后,处理name属性时,由于map中已存在key相同的值,所以"/name"这个path就没有放入该map中了。不知道是我用的不对还是逻辑上有问题?

Hope to hear from you, sincerely.

使用的fastjson版本是1.2.40,如下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.40</version>
</dependency>

回答

5

搜了下其它的issues,没有搜到这个问题。1.2.29版本也有这个问题。

2

问题已确认,如果value是重复的,会出现这个问题。我要想想怎么修改哈

4

ok

5

@wenshao 这个问题还是没有解决 看了1.2.56版本 只有当value是String/Number/Date/UUID类型时path才会加入结果集 对于其它类型比如Boolean类型 还是存在问题

7

@wenshao 这个问题还是没有解决 看了1.2.56版本 只有当value是String/Number/Date/UUID类型时path才会加入结果集 对于其它类型比如Boolean类型 还是存在问题

确实是,Boolean类型还是存在, @wenshao 我觉得是不是应该精确判断下?如下

String p = values.put(javaObject, parent);
        if (p != null) {
            if (p.equels(parent) ) {
                return;
            }
        }