0

0

将 JSON 数据高效映射为类型安全、可访问的 Java 对象

聖光之護

聖光之護

发布时间:2026-02-04 20:05:06

|

952人浏览过

|

来源于php中文网

原创

将 JSON 数据高效映射为类型安全、可访问的 Java 对象

本文介绍如何使用 jackson 库将嵌套 json 结构(含数组与对象)精准反序列化为结构清晰、支持 getter/setter 访问的 java 实体类,替代原始 map 方式,提升代码可维护性与类型安全性。

在实际开发中,直接将 JSON 解析为 Map(如 GSON 的 TypeToken 方式)虽能快速读取数据,但缺乏编译期类型检查、无法直接调用属性方法、难以进行字段级编辑或校验,且嵌套结构(如 systems 数组中的对象列表)访问繁琐易错。更专业、可持续的方案是基于 JSON 结构定义强类型的 Java Bean 类,并借助成熟的序列化库完成双向映射

推荐使用 Jackson Databind(比 GSON 更广泛用于 Spring 生态,对泛型、嵌套集合支持更稳健)。首先,根据提供的 JSON 结构创建两个对应类:

// 主配置类,对应顶层 JSON 对象
public class AppInventory {
    private String title;
    private String description;
    private List systems;

    // 构造函数(可选)
    public AppInventory() {}

    // Getter 和 Setter 方法(务必完整实现,否则 Jackson 反序列化失败)
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }

    public String getDescription() { return description; }
    public void setDescription(String description) { this.description = description; }

    public List getSystems() { return systems; }
    public void setSystems(List systems) { this.systems = systems; }
}

// 嵌套系统信息类,对应 "systems" 数组中的每个对象
public class SystemInfo {
    private String name;
    private String purpose;
    private String owner;
    private List subOwner;  // 注意:JSON 中键名为 "sub_owner",Java 属性名可小写驼峰
    private String location;
    private String tag;

    // Getter 和 Setter(同上,必须提供)
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getPurpose() { return purpose; }
    public void setPurpose(String purpose) { this.purpose = purpose; }

    public String getOwner() { return owner; }
    public void setOwner(String owner) { this.owner = owner; }

    public List getSubOwner() { return subOwner; }
    public void setSubOwner(List subOwner) { this.subOwner = subOwner; }

    public String getLocation() { return location; }
    public void setLocation(String location) { this.location = location; }

    public String getTag() { return tag; }
    public void setTag(String tag) { this.tag = tag; }
}
✅ 关键注意事项:Jackson 默认按 Java Bean 约定(getter/setter) 匹配字段,不依赖 @JsonProperty 注解即可工作;若 JSON 键名与 Java 属性名不一致(如 "sub_owner" → subOwner),Jackson 默认启用 SNAKE_CASE 或 LOWER_CAMEL_CASE 自动映射(2.12+ 版本默认支持下划线转驼峰);所有字段的 setter 方法必须存在,否则反序列化时该字段将为 null;使用 List 而非原始数组,便于后续增删改查操作;若需兼容旧版 Jackson 或自定义命名策略,可在 ObjectMapper 中配置:ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

接下来,执行反序列化并访问/修改数据:

Hika AI
Hika AI

Hika AI是一个免费的AI智能搜索引擎

下载
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class JsonToJavaExample {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        // 读取 JSON 文件内容
        String jsonData = Files.readString(Paths.get("Java/system.json"));

        // 一行代码完成强类型反序列化
        AppInventory inventory = mapper.readValue(jsonData, AppInventory.class);

        // ✅ 安全、直观地访问任意层级数据
        System.out.println("App Title: " + inventory.getTitle());
        System.out.println("Total Systems: " + inventory.getSystems().size());

        // 修改第一个系统的 owner
        if (!inventory.getSystems().isEmpty()) {
            SystemInfo firstSystem = inventory.getSystems().get(0);
            firstSystem.setOwner("New IT Lead");
            System.out.println("Updated owner: " + firstSystem.getOwner());
        }

        // ✅ 序列化回 JSON(验证修改是否生效)
        String updatedJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(inventory);
        System.out.println(updatedJson);
    }
}

通过此方式,你不仅能精准访问 inventory.getSystems().get(0).getSubOwner().get(1) 这类深层路径,还能利用 IDE 自动补全、编译检查、单元测试和 Lombok 简化模板代码,真正实现 JSON ↔ Java 对象的可维护、可扩展、可调试映射。避免“字符串键查找”的脆弱性,是构建健壮配置管理或 API 客户端的基础实践。

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

118

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

69

2026.01.26

json数据格式
json数据格式

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

425

2023.08.07

json是什么
json是什么

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

538

2023.08.23

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

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

313

2023.10.13

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

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

78

2025.09.10

string转int
string转int

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

564

2023.08.02

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

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

238

2023.09.22

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

61

2026.02.04

热门下载

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

精品课程

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

共23课时 | 3.2万人学习

C# 教程
C# 教程

共94课时 | 8.5万人学习

Java 教程
Java 教程

共578课时 | 57.3万人学习

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

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