JSON to Java
JSON से Java POJO क्लास जनरेट करें
JSON इनपुट
Java आउटपुट
JSON से Java क्लास रूपांतरण क्या है?
JSON से Java क्लास रूपांतरण एक कच्चे JSON ऑब्जेक्ट को लेकर निजी फ़ील्ड, getter और setter सहित Plain Old Java Object (POJO) परिभाषाएँ तैयार करता है। Java में कोई अंतर्निर्मित JSON टाइप प्रणाली नहीं है, इसलिए प्रत्येक JSON API प्रतिक्रिया, कॉन्फ़िगरेशन फ़ाइल या मैसेज पेलोड के लिए एक संगत क्लास की आवश्यकता होती है — तभी आप उसे टाइप-सुरक्षित तरीके से उपयोग कर सकते हैं। Jackson और Gson जैसी लाइब्रेरी reflection के माध्यम से JSON कुंजियों को Java फ़ील्ड से जोड़ती हैं, लेकिन इसके लिए क्लास परिभाषाओं का पहले से मौजूद होना आवश्यक है।
JSON डीसीरियलाइज़ेशन के लिए एक मानक Java POJO प्रत्येक JSON कुंजी के लिए एक निजी फ़ील्ड, एक no-arg constructor, और प्रत्येक फ़ील्ड के लिए getter/setter घोषित करता है। नेस्टेड JSON ऑब्जेक्ट अलग-अलग क्लास बन जाते हैं। ऐरे, java.util.List आयात के साथ List<T> फ़ील्ड बन जाते हैं। JSON के प्राथमिक प्रकार Java के प्राथमिक प्रकारों (int, double, boolean) या जेनेरिक के भीतर उनके रैपर प्रकारों (Integer, Double, Boolean) से संगत होते हैं। Null मान सामान्यतः Object या एक nullable संदर्भ प्रकार से संगत होते हैं।
ये क्लास परिभाषाएँ हाथ से लिखना एक दोहराव भरा काम है। आपको प्रत्येक JSON कुंजी पढ़नी होती है, मान से Java प्रकार निर्धारित करना होता है, camelCase JSON से camelCase Java फ़ील्ड में नामकरण परंपरा बदलनी होती है, नेस्टेड ऑब्जेक्ट के लिए PascalCase क्लास नाम बनाने होते हैं, और getter/setter का बॉयलरप्लेट जोड़ना होता है। 15 फ़ील्ड और 3 नेस्टेड ऑब्जेक्ट वाले JSON के लिए इसका अर्थ है 4 क्लास, 30 से अधिक मेथड लिखना और सब कुछ एक समान बनाए रखना। एक कनवर्टर यह काम मिलीसेकंड में कर देता है।
JSON to Java कनवर्टर का उपयोग क्यों करें?
JSON से Java POJO हाथ से बनाने का अर्थ है प्रत्येक फ़ील्ड की जाँच करना, नमूना मानों से प्रकार अनुमानित करना, getter/setter लिखना, और प्रत्येक नेस्टेड ऑब्जेक्ट के लिए यही प्रक्रिया दोहराना। जब API contract बदले, तो सब कुछ हाथ से update करें। एक कनवर्टर यह repetitive काम समाप्त कर देता है।
JSON to Java के उपयोग के मामले
JSON से Java टाइप मैपिंग
प्रत्येक JSON मान एक विशिष्ट Java प्रकार से संगत होता है। नीचे दी गई तालिका दर्शाती है कि कनवर्टर प्रत्येक JSON प्रकार को उसके Java समतुल्य में कैसे अनुवाद करता है। वैकल्पिक स्तंभ List<T> जैसे जेनेरिक संदर्भों में उपयोग किए जाने वाले रैपर प्रकार, या Records जैसी नई Java सुविधाएँ दर्शाता है।
| JSON प्रकार | उदाहरण | Java प्रकार | विकल्प |
|---|---|---|---|
| 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 एनोटेशन संदर्भ
Jackson या Gson से JSON डीसीरियलाइज़ करते समय, एनोटेशन नियंत्रित करते हैं कि JSON कुंजियाँ Java फ़ील्ड से कैसे संगत होती हैं, अज्ञात फ़ील्ड कैसे संभाले जाते हैं, और null मानों का उपचार कैसे होता है। यह संदर्भ उन एनोटेशन को कवर करता है जो जनरेटेड POJO के साथ काम करते समय सबसे अधिक मिलते हैं।
| एनोटेशन | उद्देश्य | लाइब्रेरी |
|---|---|---|
| @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 बनाम Record बनाम Lombok
Java में JSON डेटा रखने के लिए टाइप युक्त संरचनाएँ परिभाषित करने के तीन सामान्य तरीके हैं। प्रत्येक अलग परियोजना शैली और Java संस्करण के लिए उपयुक्त है। POJO सबसे व्यापक संगतता वाला परंपरागत पैटर्न है। Record अपरिवर्तनीय डेटा के लिए बॉयलरप्लेट कम करता है। Lombok एनोटेशन के माध्यम से संकलन समय पर getter, setter और कंस्ट्रक्टर जनरेट करता है।
कोड उदाहरण
ये उदाहरण दर्शाते हैं कि डीसीरियलाइज़ेशन के लिए Jackson के साथ जनरेटेड Java POJO का उपयोग कैसे करें, JavaScript और Python से प्रोग्रामेटिक रूप से Java क्लास कैसे बनाएँ, और बैच जनरेशन के लिए jsonschema2pojo CLI टूल का उपयोग कैसे करें।
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