@JsonRootName एनोटेशन का उपयोग ऑब्जेक्ट को टॉप-लेवल एलिमेंट के साथ सीरियलाइज करने के लिए रैप करने के लिए किया जा सकता है। हम @JsonRootName एनोटेशन में नाम को पैरामीटर के रूप में पास कर सकते हैं। हम SerializationFeature एनम के "WRAP_ROOT_VALUE" फीचर का उपयोग कर सकते हैं जिसे रूट वैल्यू को सिंगल प्रॉपर्टी JSON ऑब्जेक्ट में रैप करने के लिए इनेबल किया जा सकता है जहां की रूट नाम है।
उदाहरण
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JsonRootNameAnnotationTest {
public static void main(String args[]) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.enable(SerializationFeature.WRAP_ROOT_VALUE)
.writeValueAsString(new Employee());
System.out.println(jsonString);
}
}
@JsonRootName(value = "user")
class Employee {
public int empId = 125;
public String empName = "Raja Ramesh";
}
आउटपुट
{"user":{"empId":125,"empName":"Raja Ramesh"}}
बिना WRAP_ROOT_VALUE के आउटपुट
{"empId":125,"empName":"Raja Ramesh"}
मुख्य बिंदु
- @JsonRootName: रैपर एलिमेंट का नाम परिभाषित करता है
- WRAP_ROOT_VALUE: SerializationFeature जो रैपिंग को इनेबल/डिसेबल करता है
- क्लास लेवल: एनोटेशन क्लास पर लागू होता है
- डीसीरियलाइजेशन: रैप्ड JSON को पढ़ने के लिए भी DeserializationFeature.UNWRAP_ROOT_VALUE इनेबल करना आवश्यक
डीसीरियलाइजेशन कॉन्फिगरेशन
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
Employee emp = mapper.readValue(jsonString, Employee.class);
उपयोग के मामले
- XML कम्पैटिबिलिटी: XML रूट एलिमेंट के समान JSON स्ट्रक्चर
- API कॉन्ट्रैक्ट: जब API स्पेसिफिकेशन रूट रैपर की मांग करता हो
- मल्टीपल रूट टाइप्स: अलग-अलग ऑब्जेक्ट टाइप्स को पहचानने के लिए
- लीगेसी सिस्टम इंटीग्रेशन: पुराने सिस्टम्स जो रैप्ड फॉर्मेट एक्सपेक्ट करते हों
कलेक्शन के साथ उपयोग
@JsonRootName("users")
List<User> users = ...;
// आउटपुट: {"users": [{"id":1,...}, {"id":2,...}]}
कस्टम नेमिंग स्ट्रेटेजी
रनटाइम पर डायनामिक रूट नाम के लिए:
mapper.setConfig(mapper.getSerializationConfig()
.withRootName(new SimpleRootName("customRoot")));