JSON to Java
Generera Java POJO-klasser från JSON
JSON-inmatning
Java-utdata
Vad är JSON till Java-klasskonvertering?
JSON till Java-klasskonvertering tar ett råformat JSON-objekt och producerar Plain Old Java Object (POJO)-definitioner med privata fält, getters och setters. Java har inget inbyggt JSON-typsystem, så varje JSON API-svar, konfigurationsfil eller meddelandenyttolast behöver en motsvarande klass innan du kan arbeta med den på ett typsäkert sätt. Bibliotek som Jackson och Gson mappar JSON-nycklar till Java-fält via reflektion, men de kräver att klassdefinitionerna finns redan.
En standard Java POJO för JSON-deserialisering deklarerar ett privat fält för varje JSON-nyckel, en konstruktor utan argument och ett getter/setter-par per fält. Nästlade JSON-objekt blir separata klasser. Arrayer blir List<T>-fält med en java.util.List-import. Primitiva JSON-typer mappas till Java-primitiver (int, double, boolean) eller deras wrapper-typer (Integer, Double, Boolean) när de används i generics. Null-värden mappas vanligtvis till Object eller en nullbar referenstyp.
Att skriva dessa klassdefinitioner för hand är repetitivt. Du läser varje JSON-nyckel, bestämmer Java-typen utifrån värdet, konverterar namnkonventioner från camelCase JSON till camelCase Java-fält, skapar PascalCase-klassnamn för nästlade objekt och lägger till getter/setter-mallkod. För ett JSON-objekt med 15 fält och 3 nästlade objekt innebär det att skriva 4 klasser, 30+ metoder och hålla allt konsekvent. En konverterare gör detta på millisekunder.
Varför använda en JSON till Java-konverterare?
Att manuellt skapa Java POJOs från JSON innebär att inspektera varje fält, härleda typer från exempelvärden, skriva getter/setter-par och upprepa processen för varje nästlat objekt. När API-kontraktet ändras uppdaterar du allt för hand. En konverterare tar bort det mekaniska arbetet.
Användningsfall för JSON till Java
Referens för JSON till Java-typmappning
Varje JSON-värde mappas till en specifik Java-typ. Tabellen nedan visar hur konverteraren översätter varje JSON-typ till sin Java-motsvarighet. Kolumnen Alternativ visar wrapper-typer som används i generiska sammanhang som List<T>, eller nyare Java-funktioner som Records.
| JSON-typ | Exempel | Java-typ | Alternativ |
|---|---|---|---|
| string | "hello" | String | String |
| number (integer) | 42 | int | int / Integer |
| number (float) | 3.14 | double | double / Double |
| boolean | true | boolean | boolean / Boolean |
| null | null | Object | Object (or @Nullable String) |
| object | {"k": "v"} | NestedClass | Record (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> |
Referens för Java JSON-annotationer
Vid deserialisering av JSON med Jackson eller Gson styr annotationer hur JSON-nycklar mappas till Java-fält, hur okända fält hanteras och hur null-värden behandlas. Denna referens täcker de annotationer du stöter på oftast när du arbetar med genererade POJOs.
| Annotation | Syfte | Bibliotek |
|---|---|---|
| @JsonProperty("name") | Maps a JSON key to a Java field with a different name | Jackson |
| @SerializedName("name") | Same as @JsonProperty, but for the Gson library | Gson |
| @JsonIgnoreProperties | Ignores unknown JSON keys during deserialization instead of failing | Jackson |
| @Nullable | Marks a field as accepting null values from JSON input | JSR 305 / JetBrains |
| @NotNull | Enforces that a field must not be null, throws on violation | Bean Validation |
| @JsonFormat(pattern=...) | Defines a date/time format for serialization and deserialization | Jackson |
POJO vs Record vs Lombok
Java har tre vanliga metoder för att definiera typade strukturer för att lagra JSON-data. Var och en passar en annan projektstil och Java-version. POJOs är det traditionella mönstret med bredast kompatibilitet. Records minskar mallkod för oföränderliga data. Lombok genererar getters, setters och konstruktorer vid kompileringstid via annotationer.
Kodexempel
Dessa exempel visar hur man använder genererade Java POJOs med Jackson för deserialisering, hur man producerar Java-klasser programmatiskt från JavaScript och Python, och hur man använder CLI-verktyget jsonschema2pojo för batchgenerering.
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
}// 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;
// }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;
# }# 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