.JSONObject#putByPath 方法传入的路径表达式中存在纯数字字符串生成的 json 对象有问题
Closed this issue · 2 comments
cnzeropro commented
版本情况
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。
详细情况,如下图:
- 复现代码
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);
- 堆栈信息
![1714308206449](https://private-user-images.githubusercontent.com/60088111/326258178-b8b08f5b-917a-4e2e-86af-8dfd33e8442d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg1MjEzNzgsIm5iZiI6MTcxODUyMTA3OCwicGF0aCI6Ii82MDA4ODExMS8zMjYyNTgxNzgtYjhiMDhmNWItOTE3YS00ZTJlLTg2YWYtOGRmZDMzZTg0NDJkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE2VDA2NTc1OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUyODM0YWVlYmQ5M2JlODlkZTJkODdmZjMxZjFkMTQ1MjNiNThiOWMzYjg1MzYyMzAyNjBlYzkyYmVjZmMyZTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.KXIU7EaZalQIkdRCjVGQYbvZInBhnQSomyGOf28Bwt4)
- 测试涉及到的文件(注意脱密)
(无)
cnzeropro commented
目前处理方案,使用 cn.hutool.json.JSONObject#set(java.lang.String, java.lang.Object) 或者 cn.hutool.json.JSONArray#put(java.lang.Object) 处理
looly commented
@cnzeropro 出现这个情况的原因在于:
aa.123.name
在BeanPath表示:aa
字段下第123
个节点的name,即相当于:aa[123].name
。
这里aa
被当作一个json数组,这个数组为空,Hutool对于你调用putByPath的理解为:我想对aa
的第123个节点的name属性赋,但这个数组是空的咋办呢?那只有先填充前0~122的位置为null
。
因此此处逻辑并没有问题。