[alibaba/fastjson]JSON.parseObject() get() 相同结构的json解析后居然返回两种类型,要不要再奇葩一点

2024-08-30 421 views
8

JSONObject obj = JSON.parseObject("{parentid:1}") ; obj.get("parentid") //获取到的是int类型

JSONObject obj = JSON.parseObject("{parentid:9223372036854775807}") ; obj.get("parentid") //获取到的是long类型 要不要再奇葩一点,应该是大兼容小吧

回答

9

json结构虽然相同, 但数据类型不同是因为后者的数据太大, int存不下, 所以才用long存储, 这应该没啥问题吧

6

我只想问我的函数接受一个long型参数,难道我要这样用吗? JSONObject params= JSON.parseObject("{parentid:9223372036854775807}") ; Object obj = params.get( "parentid"); long parentId = obj instanceof Integer ? (long) (int) ((Integer) obj) : (long) obj;

6

你看看下面的写法是不是符合你的想法

JSONObject params = JSON.parseObject("{parentid: 313421415151412141}")
Object obj = params.get("parentid");
long parentId = Long.valueOf(obj).longValue()

或者写个bean然后调用JSON.parseObject(String, Class\<T>)也能解决, 毕竟你那种写法中的params.get("parentid")返回的具体类型以最小能容纳的类型存储是没啥问题的, 不可能总用long去存储那些较小的整数, 这样会浪费内存

总之, fastjson只负责会根据你定义的数据类型来反序列化json, 如果你没定义数据类型, 那么以最小的数据类型存数据, 我觉得是没问题的.

2

你们不知道可以这样吗?

JSONObject params = JSON.parseObject("{parentid: 313421415151412141}") 
Long xxx = params.getLong("parentid")
1

我的数据格式在整个程序中是一致的,在调用数据完成后就开始解析,只有至具体方法时才知晓数据包含的字段和类型.所以不能用params.getLong("parentid")

9

请问目前有解决方案么,我也遇到这个问题,会将jsonString 中我希望的long类型转为int类型

0

目前只能先这样了 JSONObject params= JSON.parseObject("{parentid:9223372036854775807}") ; Object obj = params.get( "parentid"); long parentId = obj instanceof Integer ? (long) (int) ((Integer) obj) : (long) obj;