0

0

JSON 无法正确反序列化为 Java POJO 对象的解决方案

霞舞

霞舞

发布时间:2026-01-29 18:50:01

|

653人浏览过

|

来源于php中文网

原创

JSON 无法正确反序列化为 Java POJO 对象的解决方案

restassured 默认 json 反序列化机制(如 jackson)与嵌套不规则结构(如 `"content": [{ "subject": "..."}, { "content": "..."}]`)存在兼容性问题,导致字段全为 null;改用 gson 手动解析并配置字段映射可彻底解决。

在使用 RestAssured 进行 API 测试时,若通过 response.extract().as(OriginalDTO.class) 直接将响应体反序列化为自定义 POJO,却出现所有字段均为 null 的现象,根本原因通常不是 POJO 定义错误,而是 RestAssured 内置的反序列化器(默认为 Jackson)无法正确处理该 JSON 的特殊结构

观察提供的 JSON 响应,其核心特征是:顶层字段(如 "Content"、"Generic"、"Participants")均以数组形式包裹多个键值对对象,且每个对象内部结构稀疏、键名不统一、甚至包含空对象 {} 或 HTML 编码内容。例如:

"Content": [
  { "Subject": "EmailWithDOCAttachmentJCBKMJJ Test Email..." },
  { "Content": "An email includes Docx file as an attachment" },
  { "Content Html": "" },
  { "Record Date": "2023-01-30 12:27:53.000" }
]

这种“数组内含异构 Map”的模式,不符合标准 Java Bean 的扁平化属性映射逻辑。Jackson 默认期望 "Content" 字段对应一个 List,而 Content 类中需明确定义 subject、content、contentHtml、recordDate 等字段——但实际 JSON 中这些字段分散在不同数组元素里,且命名含空格/大小写混合(如 "Content Html"),导致字段匹配失败,最终全部设为 null。

✅ 正确做法:绕过 RestAssured 的自动反序列化,改用 Gson 手动解析,并合理建模数据结构

立即学习Java免费学习笔记(深入)”;

Magician
Magician

Figma插件,AI生成图标、图片和UX文案

下载
  1. 使用 Gson 显式解析(推荐)
    如答案所示,替换原代码:

    // ❌ 不可靠(依赖 RestAssured + Jackson,默认不支持嵌套动态键)
    OriginalDTO original = response.then().statusCode(200).extract().as(OriginalDTO.class);

    为:

    // ✅ 可靠(Gson 更灵活,支持 @SerializedName 映射复杂键名)
    Gson gson = new GsonBuilder()
        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) // 可选:辅助处理下划线命名
        .create();
    OriginalDTO original = gson.fromJson(response.body().asString(), OriginalDTO.class);
  2. POJO 建模建议优化
    当前 OriginalDTO 中 @SerializedName("Content") private List content; 的设计隐含了“每个 Content 对象应同时拥有 Subject、Content、Content Html 等字段”,但实际 JSON 是「按语义拆分到不同对象」。更贴合实际的建模方式是:

    • 将 Content、Generic、Information 等字段声明为 List>(保留原始结构)
    • 或定义专用容器类(如 ContentEntry),配合 @SerializedName 精确映射每个可能的键:
    public static class ContentEntry {
        @SerializedName("Subject")
        private String subject;
        @SerializedName("Content")
        private String content;
        @SerializedName("Content Html")
        private String contentHtml;
        @SerializedName("Record Date")
        private String recordDate;
        // getter/setter...
    }

    并在 OriginalDTO 中改为:

    @SerializedName("Content")
    private List content;
  3. 关键注意事项

    • ✅ 确保 @SerializedName 注解来自 com.google.gson.annotations.SerializedName(非 Jackson 的 @JsonProperty);
    • ✅ 若使用 Lombok 的 @Getter/@Setter,需确认无构造函数冲突(Gson 要求默认构造函数或 @NoArgsConstructor);
    • ⚠️ 避免在 POJO 中混用 Jackson(@JsonProperty)和 Gson(@SerializedName)注解,否则行为不可控;
    • ? 调试技巧:先打印 response.body().asString() 确认响应内容完整,再用 gson.toJson(...) 验证序列化方向是否正常。

总结:RestAssured 的 as(Class) 方法本质是快捷封装,底层仍受限于所配 JSON 库的能力。面对非标准、高嵌套、键名不规范的 JSON(常见于遗留系统或松散定义的搜索/归档接口),主动接管反序列化流程,选用 Gson 并精准建模,是最稳定、最可控的实践方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

419

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

236

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

539

2023.12.01

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号