Fastjson处理Long数据变为Integer的解决方案及用法详解

Ruby
Ruby
发布时间:2026-10-16| 4人浏览过
原创

在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 进阶技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。