Java中解析嵌套JSON字符串并构建目标对象结构的完整教程

阿瑶酱_6172

阿瑶酱_6172

2026-03-20

199人浏览

原创

Java中解析嵌套JSON字符串并构建目标对象结构的完整教程

本文详解如何使用gson库解析复杂嵌套json schema字符串,并动态提取字段定义,生成符合结构要求的示例对象json(如{"a":"b","object":{"fname":"sho","lname":"sho"}})。

本文详解如何使用gson库解析复杂嵌套json schema字符串,并动态提取字段定义,生成符合结构要求的示例对象json(如{"a":"b","object":{"fname":"sho","lname":"sho"}})。

在实际开发中,我们常需根据JSON Schema动态生成符合其约束的示例数据(例如用于表单预填充、Mock服务或测试用例构造)。你提供的原始JSON并非普通数据,而是一个描述数据结构的Schema字符串(含schema和fieldRequirements两大部分),目标是据此生成一个合法的实例对象JSON,如 {"a":"b","object":{"fname":"Sho","lname":"Sho"}}。

关键难点在于:该Schema具有深层嵌套(如 object → fname/lname),且未提供直接可用的POJO类。若强行硬编码映射,将丧失灵活性;而仅用Map又难以准确还原层级与类型语义。因此,推荐采用 “Schema解析 + 递归建模 + 动态实例化” 的三步策略,以Gson为核心工具实现。

✅ 推荐方案:使用Gson解析Schema并递归构造示例对象

首先,引入Gson依赖(Maven):

<dependency><groupid>com.google.code.gson</groupid><artifactid>gson</artifactid><version>2.10.1</version></dependency>

接着,定义轻量级Schema模型(无需完全覆盖JSON Schema规范,聚焦所需字段):

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.*;

// 简化Schema结构映射(仅关注properties、type、required等核心字段)
static class SchemaProperty {
    String type;
    Map<string schemaproperty> properties;
    List<string> required;
    boolean additionalProperties = true;
}

static class SchemaRoot {
    Map<string schemaproperty> properties;
    List<string> required;
    boolean additionalProperties = true;
}

static class FieldRequirement {
    String name;
    String type;
    boolean required;
    List<fieldrequirement> subfields;
}</fieldrequirement></string></string></string></string>

然后,编写核心逻辑:解析原始JSON → 提取Schema结构 → 递归生成示例值 → 序列化为目标JSON:

public static String generateExampleFromSchema(String schemaJson) {
    Gson gson = new Gson();

    // Step 1: 解析外层结构,提取 schema 和 fieldRequirements
    Type mapType = new TypeToken<map object>>(){}.getType();
    Map<string object> root = gson.fromJson(schemaJson, mapType);

    Map<string object> schemaData = (Map<string object>) root.get("schema");
    Map<string object> fieldReq = (Map<string object>) root.get("fieldRequirements");

    // Step 2: 构建根级Map作为示例对象容器
    Map<string object> example = new LinkedHashMap();

    // Step 3: 递归填充字段(基于fieldRequirements更直观,因其明确包含name/type/subfields)
    populateFromFieldRequirement(example, fieldReq);

    // Step 4: 序列化为格式化JSON字符串
    return gson.toJson(example);
}

private static void populateFromFieldRequirement(Map<string object> target, Map<string object> req) {
    String name = (String) req.get("name");
    String type = (String) req.get("type");
    boolean required = (Boolean) req.getOrDefault("required", false);

    if ("object".equalsIgnoreCase(type)) {
        Map<string object> nested = new LinkedHashMap();
        @SuppressWarnings("unchecked")
        List<map object>> subfields = (List<map object>>) req.get("subfields");
        if (subfields != null) {
            for (Map<string object> sub : subfields) {
                populateFromFieldRequirement(nested, sub);
            }
        }
        target.put(name, nested);
    } else if ("text".equalsIgnoreCase(type) || "string".equalsIgnoreCase(type)) {
        // 使用name作为默认示例值(可按需替换为随机/占位符)
        target.put(name, name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase());
    } else {
        target.put(name, "default_" + type);
    }
}</string></map></map></string></string></string></string></string></string></string></string></string></map>

调用示例:

public static void main(String[] args) {
    String inputJson = "{...}"; // 即你提供的长JSON字符串
    String result = generateExampleFromSchema(inputJson);
    System.out.println(result);
    // 输出:{"a":"A","object":{"fname":"Fname","lname":"Lname"}}
}

⚠️ 注意事项与最佳实践

  • 不要直接使用 List.class 解析复杂嵌套Schema:原文答案中的示例适用于扁平数组(如 [{"id":1,"name":"John"}]),但你的输入是单个嵌套对象,强制用 List.class 会抛出 JsonParseException。
  • 优先基于 fieldRequirements 构建实例:相比schema.properties,fieldRequirements.subfields 结构更清晰、命名更贴近业务字段,且已显式声明层级关系,是生成示例数据的更可靠依据。
  • 类型安全建议:如需强类型校验,可结合 JsonSchemaValidator(如everit-org/json-schema)对生成结果做二次验证。
  • 扩展性提示:若需支持更多类型(如number, boolean, array),可在 populateFromFieldRequirement 中补充对应分支,并注入默认值策略(如 Random.nextInt() 或 Boolean.TRUE)。

通过以上方法,你不仅能精准还原JSON Schema所定义的嵌套结构,还能灵活控制示例值生成逻辑,真正实现“Schema即契约,数据可推导”的工程实践目标。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11157

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8282

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7152

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1204

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

968

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1436

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2949

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20211

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1295

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习