Fastjson处理Long数据变为Integer的解决方案及用法详解
在Java开发中,使用Fastjson传输`Long`类型数据时,若值较小可能被反序列化为`Integer`,引发类型转换异常。本文分析该现象并提供基于`Number`父类的兼容方案,同时总结Fastjson在对象序列化、字符串转换及多层嵌套JSON解析中的常见用法。
Fastjson Long数据精度丢失原因
在实际开发中,网元A将一个包含`Long`类型`taskId`字段的VO对象通过Fastjson序列化为JSON字符串,并通过HTTP请求发送给网元B。网元B端接收时若使用`Map`结构解析,会发现`taskId`的实际数据类型变为`Integer`(如图一所示)。
此时若尝试强制转换为`Long`:
long taskId = (long) reqMap.get("taskId");
将会抛出 `java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long` 异常。这是因为Fastjson默认根据数值范围推断类型:当整数值不超过 `Integer.MAX_VALUE`(2147483647)时,默认按`Integer`处理。如果设置为更大的值如3147483647,则会被正确识别为`Long`(如图二所示)。
通用类型安全获取方法
为保证代码健壮性,推荐使用其父类 `java.lang.Number` 作为中间过渡类型。`Number` 提供了通用的类型提取方法,可以安全地转换为任意数值类型。
操作方案:先用 `Number` 接收 Map 中的值,随后调用
.longValue()获取 long 类型数据。
Object rawTaskId = reqMap.get("taskId");
if (rawTaskId instanceof Number) {
taskId = ((Number) rawTaskId).longValue();
}
这种方法不仅解决了 Fastjson 的类型推断差异,也能应对来自不同来源或前端传来的各种数字类型。
Fastjson 核心功能实战
在 Java/Scala 混合环境或常规数据处理中,掌握 JSON 与对象、集合之间的转换至关重要。以下为 Fastjson 的常用操作示例。
第1步:引入依赖
首先确保项目中引入了对应的版本。以下示例以 1.2.47 为例:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
第2步:Java 对象序列化
假设存在一个名为 entity.user 的实体类:
public class User {
private Integer id;
private String username;
private String password;
// Getter / Setter / toString 省略
}
将多个对象存入 Map 并序列化为 JSON:
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
public class MapToJson {
public static void main(String[] args) {
User u1 = new User();
u1.setId(1);
u1.setUsername("lisa");
User u2 = new User();
u2.setId(2);
u2.setUsername("julian");
Map<String, User> maps = new HashMap<>();
maps.put("user1", u1);
maps.put("user2", u2);
// 输出结果
System.out.println(JSON.toJSONString(maps));
}
}
控制台输出类似如下格式(字段顺序可能变动):
{"user1":{"id":1,"password":"...","username":"lisa"},"user2":{"id":2,"username":"julian"}}
第3步:多语言环境下的字符串转换
若项目涉及 Scala 等 JVM 语言,可直接利用 JSON.toJSONString 进行格式化输出:
case class Student(id:Int, name:String)
val stu1=Student(1,"lisa")
val maps=Map[String,Student]()
maps+= "1"->stu1
// PrettyFormat 开启美化打印
val result = JSON.toJSONString(maps, SerializerFeature.PrettyFormat)
第4步:解析复杂的多层嵌套 JSON
在处理 API 返回的深层嵌套数据时,可利用 JSONObject 逐级获取节点:
val str = "{\"error\":200,\"msg\":null,\"tianji_api_agentn_fenqiscorev10_response\":{\"tags\":{\"150\":0,\"151\":0,\"152\":0},\"biz_id\":\"2589e...\"}}"
// 1. 解析根节点
val json: JSONObject = JSON.parseObject(str)
// 2. 获取特定层级对象
val tj: JSONObject = json.getJSONObject("tianji_api_agentn_fenqiscorev10_response")
// 3. 深入获取 tags 对象
val tag = tj.getJSONObject("tags")
// 4. 提取指定 key 的值
val result = tag.getString("150")
println(result)
通过上述组合操作,可以有效规避基础数据类型转化带来的运行时错误,并熟练掌握常见场景下的 JSON 处理流程。
以上就是 Fastjson 处理 Long 数据类型问题及基础用法的详细内容,更多关于 Fastjson 进阶技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









