JSON'dan Java'ya
JSON'dan Java POJO sınıfları oluşturun
JSON Girişi
Java Çıkışı
JSON'dan Java Sınıfına Dönüşüm Nedir?
JSON'dan Java sınıfına dönüşüm, ham bir JSON nesnesini alır ve özel alanlar, getter'lar ile setter'lar içeren Plain Old Java Object (POJO) tanımlarına dönüştürür. Java'nın yerleşik bir JSON tür sistemi yoktur; bu nedenle her JSON API yanıtı, yapılandırma dosyası veya mesaj yükü için karşılık gelen bir sınıf oluşturmanız gerekir. Jackson ve Gson gibi kütüphaneler JSON anahtarlarını Java alanlarına yansıma (reflection) aracılığıyla eşler; ancak sınıf tanımlarının önceden mevcut olmasını gerektirir.
JSON seri dışı bırakma için kullanılan standart bir Java POJO, her JSON anahtarı için bir özel alan, argümansız bir kurucu ve her alan için bir getter/setter çifti bildirir. İç içe JSON nesneleri ayrı sınıflara dönüşür. Diziler, java.util.List içe aktarımıyla birlikte List<T> alanlarına dönüşür. Temel JSON türleri, Java temel türlerine (int, double, boolean) ya da jenerik içinde kullanıldıklarında sarmalayıcı türlerine (Integer, Double, Boolean) eşlenir. Null değerler genellikle Object'e veya null olabilir bir başvuru türüne eşlenir.
Bu sınıf tanımlarını elle yazmak tekrarlayıcı bir iştir. Her JSON anahtarını okur, değerden Java türünü belirler, adlandırma kurallarını camelCase JSON'dan camelCase Java alanlarına dönüştürür, iç içe nesneler için PascalCase sınıf adları oluşturur ve getter/setter şablonunu eklersiniz. 15 alana ve 3 iç içe nesneye sahip bir JSON nesnesi için 4 sınıf, 30'dan fazla metot yazıp hepsini tutarlı tutmanız gerekir. Bir dönüştürücü bunu milisaniyeler içinde yapar.
Neden JSON'dan Java Dönüştürücü Kullanmalısınız?
JSON'dan Java POJO'larını elle oluşturmak, her alanı incelemeyi, örnek değerlerden türleri çıkarsamamayı, getter/setter çiftleri yazmayı ve bu işlemi her iç içe nesne için tekrarlamayı gerektirir. API sözleşmesi değiştiğinde her şeyi elle güncellersiniz. Bir dönüştürücü bu mekanik işi ortadan kaldırır.
JSON'dan Java'ya Kullanım Senaryoları
JSON'dan Java'ya Tür Eşleme
Her JSON değeri belirli bir Java türüne eşlenir. Aşağıdaki tablo, dönüştürücünün her JSON türünü Java karşılığına nasıl çevirdiğini göstermektedir. Alternatif sütunu, List<T> gibi jenerik bağlamlarda kullanılan sarmalayıcı türlerini veya Record'lar gibi daha yeni Java özelliklerini gösterir.
| JSON Türü | Örnek | Java Türü | Alternatif |
|---|---|---|---|
| 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> |
Java JSON Ek Açıklama Başvurusu
Jackson veya Gson ile JSON seri dışı bırakırken ek açıklamalar; JSON anahtarlarının Java alanlarına nasıl eşlendiğini, bilinmeyen alanların nasıl işlendiğini ve null değerlerin nasıl ele alındığını kontrol eder. Bu başvuru, üretilen POJO'larla çalışırken en sık karşılaşacağınız ek açıklamaları kapsar.
| Ek Açıklama | Amaç | Kütüphane |
|---|---|---|
| @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 ile Record ve Lombok Karşılaştırması
Java'da JSON verilerini tutmak için türlendirilmiş yapılar tanımlamanın üç yaygın yolu vardır. Her biri farklı bir proje tarzına ve Java sürümüne uygundur. POJO'lar en geniş uyumluluğa sahip geleneksel kalıptır. Record'lar değişmez veriler için şablon kodunu azaltır. Lombok, ek açıklamalar aracılığıyla derleme zamanında getter'lar, setter'lar ve kurucular üretir.
Kod Örnekleri
Bu örnekler, üretilen Java POJO'larının Jackson ile seri dışı bırakma için nasıl kullanılacağını, JavaScript ve Python'dan programatik olarak Java sınıflarının nasıl üretileceğini ve toplu üretim için jsonschema2pojo CLI aracının nasıl kullanılacağını göstermektedir.
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