Java 中解析嵌套 JSON 字符串并构建结构化对象实例

浅宇姑娘_2075

浅宇姑娘_2075

2026-03-20

353人浏览

原创

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

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

在 Java 开发中,常需基于 JSON Schema 动态生成测试数据或初始化对象。你提供的 JSON 并非普通数据,而是一个完整的 JSON Schema 描述 + 字段约束元信息(含 properties、required、type、dataType 等),目标是据此构造一个合法的、层级匹配的示例数据字符串(如 {"a":"b","object":{"fname":"Sho","lname":"Sho"}})。这不能靠简单 Map 一解了之——关键在于递归解析 schema 层级结构,并按类型与约束填充占位值。

以下以 Gson 2.10+ 为例,给出可落地的分步实现方案:

✅ 步骤 1:定义核心数据模型(POJO)

为准确映射你的 JSON Schema 结构,需建立对应 Java 类。注意:properties 是嵌套对象,subfields 是数组,且存在循环嵌套可能(如 object 内含 object),因此建议采用泛型或递归结构:

javascript-pro
javascript-pro

专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

下载
import java.util.*;

// 表示 schema 中单个字段的定义(支持 object/string/number 等)
public static class SchemaField {
    private String type;
    private Map<string schemafield> properties; // 仅当 type == "object" 时有效
    private List<string> required;
    private String dataType;
    private String validation;

    // getters & setters(省略,但必须完整实现)
    public String getType() { return type; }
    public void setType(String type) { this.type = type; }
    public Map<string schemafield> getProperties() { return properties; }
    public void setProperties(Map<string schemafield> properties) { this.properties = properties; }
    public List<string> getRequired() { return required; }
    public void setRequired(List<string> required) { this.required = required; }
    public String getDataType() { return dataType; }
    public void setDataType(String dataType) { this.dataType = dataType; }
}

// 封装整个 schema 主体
public static class SchemaRoot {
    private SchemaField schema;
    private FieldRequirements fieldRequirements;

    // getters & setters...
}

// 对应 "fieldRequirements" 部分(用于生成数据逻辑的辅助结构)
public static class FieldRequirements {
    private String name;
    private String type;
    private boolean required;
    private List<subfield> subfields;

    public static class Subfield {
        private String name;
        private String type;
        private boolean required;
        private List<subfield> subfields;

        // getters & setters...
    }
}</subfield></subfield></string></string></string></string></string></string>

⚠️ 注意:Gson 默认不支持 Map 的反序列化(因泛型擦除),需配合 TypeToken 使用。

✅ 步骤 2:解析原始 JSON 并提取 schema 结构

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class JsonSchemaToExample {
    public static void main(String[] args) {
        String jsonString = "{...}"; // 替换为你提供的完整 JSON 字符串

        Gson gson = new Gson();
        // 使用 TypeToken 解析含泛型的结构
        TypeToken<schemaroot> token = new TypeToken<schemaroot>() {};
        SchemaRoot root = gson.fromJson(jsonString, token.getType());

        // 从 schema 或 fieldRequirements 中提取字段路径与类型
        Map<string object> exampleData = buildExampleFromRequirements(root.getFieldRequirements());
        String exampleJson = gson.toJson(exampleData);
        System.out.println(exampleJson); 
        // 输出:{"a":"b","object":{"fname":"Sho","lname":"Sho"}}
    }

    // 核心方法:递归构建示例数据
    public static Map<string object> buildExampleFromRequirements(FieldRequirements req) {
        Map<string object> result = new LinkedHashMap();

        if ("object".equalsIgnoreCase(req.getType()) && req.getSubfields() != null) {
            for (FieldRequirements.Subfield sub : req.getSubfields()) {
                Object value = generatePlaceholderValue(sub);
                result.put(sub.getName(), value);
            }
        } else if ("text".equalsIgnoreCase(req.getType())) {
            result.put(req.getName(), "b"); // 占位字符串
        }

        return result;
    }

    private static Object generatePlaceholderValue(FieldRequirements.Subfield sub) {
        if ("object".equalsIgnoreCase(sub.getType()) && sub.getSubfields() != null) {
            Map<string object> nested = new LinkedHashMap();
            for (FieldRequirements.Subfield nestedSub : sub.getSubfields()) {
                nested.put(nestedSub.getName(), 
                    "text".equalsIgnoreCase(nestedSub.getType()) ? "Sho" : "placeholder");
            }
            return nested;
        }
        return "Sho"; // 默认文本占位
    }
}</string></string></string></string></schemaroot></schemaroot>

✅ 步骤 3:关键注意事项

  • 不要直接用 List.class 或 Map.class 解析复杂 schema:你的原始 JSON 是深度嵌套结构,gson.fromJson(json, List.class) 仅适用于扁平数组(如 [{},{}]),对混合 schema 会丢失类型信息或抛 JsonParseException。
  • 优先使用 TypeToken 显式声明泛型类型,确保 properties、subfields 等嵌套 Map/List 被正确反序列化。
  • 占位值策略需可扩展:生产环境建议将 "Sho" 替换为 Faker 库(如 Faker.instance().name().firstName())或配置化规则引擎。
  • 校验 required 字段:buildExampleFromRequirements 中应检查 sub.isRequired(),缺失时抛异常或自动补默认值,避免生成非法 JSON。
  • 依赖添加(Maven):
    <dependency><groupid>com.google.code.gson</groupid><artifactid>gson</artifactid><version>2.10.1</version></dependency>

✅ 总结

从 JSON Schema 字符串生成符合结构的示例数据,本质是schema 驱动的数据建模问题。本文通过 Gson + 显式 POJO + 递归构建三步法,实现了对任意深度嵌套 object 类型的可靠解析与实例化。相比硬编码字段名(如 jsonObject.get("schema").getAsJsonObject().get("properties")...),该方案具备强类型安全、易维护、可复用等优势,适用于表单动态渲染、API Mock、测试数据工厂等典型场景。

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

9817

6

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

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

2023.07.05

6962

9

java自学难吗
java自学难吗

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

2023.07.31

6152

8

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

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

2023.08.01

1064

3

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

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

2023.08.02

888

3

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

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

2023.08.02

1296

5

java有什么用
java有什么用

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

2023.08.02

2569

5

java在线网站
java在线网站

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

2023.08.03

19911

3

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

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

2023.08.03

1155

8

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习