Conversor JSON para Java
Gere classes Java POJO a partir de JSON
Entrada JSON
Saída Java
O que é a conversão de JSON para classes Java?
A conversão de JSON para classes Java pega um objeto JSON bruto e produz definições de Plain Old Java Object (POJO) com campos privados, getters e setters. O Java não possui um sistema de tipos JSON nativo, portanto toda resposta de API JSON, arquivo de configuração ou payload de mensagem precisa de uma classe correspondente antes de poder ser manipulada de forma segura em termos de tipos. Bibliotecas como Jackson e Gson mapeiam as chaves JSON para campos Java via reflexão, mas exigem que as definições de classe existam primeiro.
Um POJO Java padrão para desserialização de JSON declara um campo privado para cada chave JSON, um construtor sem argumentos e um par getter/setter por campo. Objetos JSON aninhados se tornam classes separadas. Arrays se tornam campos List<T> com um import de java.util.List. Tipos JSON primitivos mapeiam para primitivos Java (int, double, boolean) ou seus tipos wrapper (Integer, Double, Boolean) quando usados dentro de genéricos. Valores nulos geralmente mapeiam para Object ou um tipo de referência que aceita null.
Escrever essas definições de classe manualmente é repetitivo. Você lê cada chave JSON, determina o tipo Java a partir do valor, converte convenções de nomenclatura de camelCase JSON para campos Java em camelCase, cria nomes de classe em PascalCase para objetos aninhados e adiciona o código boilerplate de getter/setter. Para um objeto JSON com 15 campos e 3 objetos aninhados, isso significa escrever 4 classes, mais de 30 métodos e manter tudo consistente. Um conversor faz isso em milissegundos.
Por que usar um conversor de JSON para Java?
Criar POJOs Java manualmente a partir de JSON significa inspecionar cada campo, inferir tipos a partir de valores de amostra, escrever pares getter/setter e repetir o processo para cada objeto aninhado. Quando o contrato da API muda, você atualiza tudo à mão. Um conversor elimina esse trabalho mecânico.
Casos de Uso de JSON para Java
Mapeamento de Tipos JSON para Java
Cada valor JSON mapeia para um tipo Java específico. A tabela abaixo mostra como o conversor traduz cada tipo JSON para seu equivalente Java. A coluna Alternativa mostra os tipos wrapper usados em contextos genéricos como List<T>, ou recursos mais novos do Java como Records.
| Tipo JSON | Exemplo | Tipo Java | Alternativa |
|---|---|---|---|
| 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> |
Referência de Anotações Java para JSON
Ao desserializar JSON com Jackson ou Gson, as anotações controlam como as chaves JSON são mapeadas para campos Java, como campos desconhecidos são tratados e como valores nulos são processados. Esta referência cobre as anotações que você encontrará com mais frequência ao trabalhar com POJOs gerados.
| Anotação | Finalidade | Biblioteca |
|---|---|---|
| @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
O Java tem três abordagens comuns para definir estruturas tipadas que armazenam dados JSON. Cada uma se adapta a um estilo de projeto e versão do Java diferente. POJOs são o padrão tradicional com a maior compatibilidade. Records reduzem o boilerplate para dados imutáveis. Lombok gera getters, setters e construtores em tempo de compilação via anotações.
Exemplos de Código
Estes exemplos mostram como usar POJOs Java gerados com Jackson para desserialização, como produzir classes Java programaticamente a partir de JavaScript e Python, e como usar a ferramenta CLI jsonschema2pojo para geração em lote.
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