dromara/hutool

.JSONObject#putByPath 方法传入的路径表达式中存在纯数字字符串生成的 json 对象有问题

Closed this issue · 2 comments

版本情况

JDK版本:oracle jdk1.8.0_301
hutool版本:5.8.12(请确保最新尝试是否还有问题)
新版依然存在,只不过因为 ”issue#3286, 增加安全检查,最多增加10倍“,无法传入太大的数字字符串

问题描述(包括截图)

这个问题是因为 cn.hutool.json.JSONObject#putByPath 方法调用 BeanPath 类解析 Bean 路径表达式,而有的业务需求把json key 作为数字字符串传入,导致解析时把其作为集合对应的index值,从而出现集合中 add 了很多 null 值。BeanPath 类本质处理逻辑没有问题,因为 Bean 字段名不可能是纯数字,但 json 中可能出现纯数字的字符串作为 key。
详细情况,如下图:
1714308312307

  1. 复现代码
        JSONObject result = JSONUtil.createObj(JSONConfig.create().setIgnoreNullValue(false));

        List<BigDecimal> values = ListUtil.of(BigDecimal.ONE, BigDecimal.ZERO, BigDecimal.TEN, BigDecimal.ZERO);
        for (int i = 0; i < values.size(); i++) {
            BigDecimal decimal = values.get(i);
            result.putByPath(String.format("%s.%s[%d].name", "aa", "123", i), DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN));
            result.putByPath(String.format("%s.%s[%d].value", "aa", "123", i), decimal);
        }

        System.out.println(result);
  1. 堆栈信息
1714308206449
  1. 测试涉及到的文件(注意脱密)
    (无)

目前处理方案,使用 cn.hutool.json.JSONObject#set(java.lang.String, java.lang.Object) 或者 cn.hutool.json.JSONArray#put(java.lang.Object) 处理

@cnzeropro 出现这个情况的原因在于:

aa.123.name在BeanPath表示:aa字段下第123个节点的name,即相当于:aa[123].name

这里aa被当作一个json数组,这个数组为空,Hutool对于你调用putByPath的理解为:我想对aa的第123个节点的name属性赋,但这个数组是空的咋办呢?那只有先填充前0~122的位置为null

因此此处逻辑并没有问题。