JSON转Java

从JSON生成Java POJO类

加载示例
根类名称:

JSON输入

Java输出

本地运行 · 粘贴密钥安全无忧
Java类将显示在这里…

什么是JSON转Java类转换?

JSON转Java类转换是指将原始JSON对象生成Plain Old Java Object(POJO)定义,包含私有字段、getter和setter方法。Java没有内置的JSON类型系统,因此每个JSON API响应、配置文件或消息负载在以类型安全的方式处理之前,都需要对应的类定义。Jackson和Gson等库通过反射将JSON键映射到Java字段,但前提是类定义必须已经存在。

用于JSON反序列化的标准Java POJO为每个JSON键声明一个私有字段、一个无参构造函数以及每个字段对应的getter/setter方法对。嵌套JSON对象会生成独立的类。数组变为带有java.util.List导入的List<T>字段。基本JSON类型映射为Java基本类型(int、double、boolean)或在泛型中使用时的包装类型(Integer、Double、Boolean)。Null值通常映射为Object或可空引用类型。

手动编写这些类定义是重复性工作:读取每个JSON键,从值推断Java类型,将命名规范从camelCase JSON转换为camelCase Java字段,为嵌套对象创建PascalCase类名,并添加getter/setter样板代码。对于一个有15个字段和3个嵌套对象的JSON对象,这意味着要编写4个类、30多个方法,并保持一切一致。转换器能在毫秒内完成这一切。

为什么使用JSON转Java转换器?

手动从JSON创建Java POJO意味着检查每个字段、从示例值推断类型、编写getter/setter方法对,并对每个嵌套对象重复此过程。当API契约发生变更时,需要手动更新所有内容。转换器消除了这些机械性工作。

即时生成POJO
粘贴JSON,不到一秒即可获得完整的Java类定义。嵌套对象、列表和基本类型均自动检测和映射。
🔒
隐私优先处理
转换完全在浏览器中通过JavaScript运行,JSON数据不会离开您的设备。API密钥、令牌和生产数据始终保持私密。
📝
正确的类型推断
每个生成的字段都使用从JSON值推断的适当Java类型:String、int、double、boolean、List<T>,或null对应的Object。包装类型在泛型中使用。
📦
无需安装或注册
打开页面,粘贴JSON即可使用。无需JDK,无需Maven依赖,无需创建账号。支持任何带浏览器的设备。

JSON转Java使用场景

Spring Boot API开发
从API JSON示例生成请求和响应DTO。粘贴预期的负载结构,获得可直接用于Spring控制器中@RequestBody和@ResponseBody注解的Java类。
Android应用开发
为Retrofit或Volley网络响应创建模型类。粘贴后端API返回的JSON,获得与Gson或Moshi转换器兼容的POJO。
微服务集成
为Kafka、RabbitMQ或gRPC JSON负载定义带类型的消息类。粘贴示例消息,生成记录服务间预期契约的POJO。
遗留系统迁移
在为REST端点封装带类型客户端时,将JSON API响应转换为Java类。适用于从松散类型的Map<String, Object>模式迁移到规范领域模型的场景。
QA与测试自动化
从API响应示例构建带类型的测试固件。QA工程师可粘贴真实JSON响应,生成可用于JUnit或TestNG测试套件(配合AssertJ断言)的POJO定义。
学习Java面向对象模式
学员可粘贴任意JSON结构,观察Java如何用类、字段、getter、setter和嵌套类型来表示它。生成的代码使抽象概念具体可见。

JSON与Java类型映射

每种JSON值都映射到特定的Java类型。下表展示转换器如何将每种JSON类型翻译为其Java等价类型。替代项列显示在List<T>等泛型上下文中使用的包装类型,或Record等较新的Java特性。

JSON类型示例Java类型替代项
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

Java JSON注解参考

使用Jackson或Gson反序列化JSON时,注解控制JSON键如何映射到Java字段、如何处理未知字段以及如何对待null值。本参考涵盖处理生成的POJO时最常用的注解。

注解用途
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO vs Record vs Lombok

Java有三种常见方式定义带类型的结构来保存JSON数据。每种方式适合不同的项目风格和Java版本。POJO是兼容性最广的传统模式。Record减少了不可变数据的样板代码。Lombok通过注解在编译时生成getter、setter和构造函数。

POJO
传统Java模式,支持Java 8+。您定义私有字段及getter/setter方法,对可变性和自定义逻辑拥有完全控制权。与所有JSON库(Jackson、Gson、Moshi)兼容。是Spring Boot、Android和企业级代码库的标准选择。
Record (Java 16+)
自Java 16内置(Java 14预览版)。紧凑语法:record User(int id, String name) 会自动生成构造函数、访问器、equals、hashCode和toString。实例不可变。Jackson从2.12版本起支持Record。最适合不需要setter的值对象和DTO。
Lombok @Data
第三方编译时注解处理器。@Data生成getter、setter、equals、hashCode和toString。@Builder添加构建者模式。在保持可变性的同时将样板代码减少到接近Record的水平。需要在构建工具(Maven/Gradle)中添加Lombok依赖并安装IDE插件。

代码示例

以下示例展示如何配合Jackson使用生成的Java POJO进行反序列化,如何通过JavaScript和Python以编程方式生成Java类,以及如何使用jsonschema2pojo CLI工具进行批量生成。

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

常见问题

POJO与Java Bean有什么区别?
POJO(Plain Old Java Object)是任何没有框架依赖的简单Java类。Java Bean是遵循特定规范的POJO:无参构造函数、带有公共getter和setter的私有字段,以及实现Serializable接口。对于JSON映射,大多数库要求Bean规范(getter/setter),但不要求Serializable。本工具生成的类遵循Bean的getter/setter模式。
与生成的POJO配合使用应选择哪个JSON库?
Jackson(com.fasterxml.jackson)是使用最广泛的Java JSON库,也是Spring Boot的默认选择。Gson(com.google.gson)在Android项目中广受欢迎,API更简洁。Moshi是Square推出的较新替代方案,专为Kotlin互操作性而设计。三者都能与拥有getter和setter的标准POJO配合使用。
转换器如何处理嵌套JSON对象?
每个嵌套对象会生成一个独立的Java类。如果名为"address"的JSON字段包含带有"street"和"city"键的对象,转换器会创建一个Address类,包含这些字段,并将父字段类型设为Address。深层嵌套结构会生成多个类定义。
JSON字段为null时会发生什么?
Null字段类型为Object,因为转换器仅凭null值无法推断预期类型。实际使用中,一旦了解API契约,应将Object替换为预期类型(String、Integer等)。使用Jackson时,null值默认无错误地赋给引用类型字段。
JSON应使用Java Record还是POJO?
Record非常适合不需要setter的不可变数据传输对象。Jackson从2.12版本起支持Record,Gson也在后续版本中添加了支持。如果项目运行在Java 16+且将API响应视为只读数据,Record可减少样板代码。如需可变性或目标Java版本为8/11,请使用POJO。
如何处理不是有效Java标识符的JSON键?
"first-name"或"2nd_place"等JSON键不是有效的Java字段名。使用Jackson的@JsonProperty("first-name")或Gson的@SerializedName("first-name")将JSON键映射到firstName这样的有效Java字段名。转换器会自动将键名转换为camelCase Java字段。
能否从JSON Schema而非JSON示例生成Java类?
本工具从JSON数据示例生成类。如需JSON Schema输入,请使用jsonschema2pojo项目(提供CLI工具、Maven插件和Gradle插件)。它读取JSON Schema文件,生成带有验证约束、默认值以及来自Schema描述的文档的带注解Java类。