@JsonManagedReference और @JsonBackReference एनोटेशन्स का उपयोग बाईडायरेक्शनल तरीके से JSON स्ट्रक्चर बनाने के लिए किया जा सकता है। @JsonManagedReference एनोटेशन एक फॉरवर्ड रेफरेंस है जो सीरियलाइजेशन प्रक्रिया के दौरान शामिल होता है जबकि @JsonBackReference एनोटेशन एक बैकरेफरेंस है जो सीरियलाइजेशन प्रक्रिया के दौरान छोड़ दिया जाता है।
उदाहरण
import java.util.*;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
public class ManagedReferenceBackReferenceTest {
public static void main(String args[]) throws JsonProcessingException {
BackReferenceBeanTest testBean = new BackReferenceBeanTest(110, "Sai Chaitanya");
ManagedReferenceBeanTest bean = new ManagedReferenceBeanTest(135, "Adithya Ram", testBean);
testBean.addEmployees(bean);
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(bean);
System.out.println(jsonString);
}
}
class ManagedReferenceBeanTest {
public int empId = 115;
public String empName = "Raja Ramesh";
@JsonManagedReference
public BackReferenceBeanTest manager;
public ManagedReferenceBeanTest(int empId, String empName, BackReferenceBeanTest manager) {
this.empId = empId;
this.empName = empName;
this.manager = manager;
}
}
class BackReferenceBeanTest {
public int empId = 125;
public String empName = "Jai Dev";
@JsonBackReference
public List<ManagedReferenceBeanTest> list;
public BackReferenceBeanTest(int empId, String empName) {
this.empId = empId;
this.empName = empName;
list = new ArrayList<>();
}
public void addEmployees(ManagedReferenceBeanTest managedReferenceBeanTest) {
list.add(managedReferenceBeanTest);
}
}
आउटपुट
{
"empId" : 135,
"empName" : "Adithya Ram",
"manager" : {
"empId" : 110,
"empName" : "Sai Chaitanya"
}
}
कैसे काम करता है
- @JsonManagedReference: "फॉरवर्ड" साइड - सामान्य रूप से सीरियलाइज होता है
- @JsonBackReference: "बैक" साइड - सीरियलाइजेशन के दौरान छोड़ दिया जाता है
- पेयरिंग: दोनों एनोटेशन्स का एक ही लॉजिकल नाम होना चाहिए (डिफ़ॉल्ट रूप से प्रॉपर्टी नाम से निष्कर्षित)
एक्सप्लिसिट नाम के साथ
@JsonManagedReference("employee-manager")
public Manager manager;
@JsonBackReference("employee-manager")
public List<Employee> subordinates;
@JsonIdentityInfo के साथ तुलना
| पहलू | @ManagedReference/@BackReference | @JsonIdentityInfo |
|---|---|---|
| एप्रोच | एक साइड को छोड़ देता है | ID रेफरेंस का उपयोग करता है |
| आउटपुट | ट्री स्ट्रक्चर (कोई डुप्लिकेशन नहीं) | फर्स्ट ऑक्यूरेंस फुल, बाद में ID रेफरेंस |
| डीसीरियलाइजेशन | बैक रेफरेंस रिस्टोर नहीं होता | फुल ऑब्जेक्ट ग्राफ रिस्टोर होता है |
| जटिलता | सरल (2 एनोटेशन्स) | अधिक कॉन्फिगरेबल |
कब किसका उपयोग करें
- @ManagedReference/@BackReference: जब बैक रेफरेंस की आवश्यकता न हो, सरल पेरेंट-चाइल्ड, आउटपुट-ओनली सीरियलाइजेशन
- @JsonIdentityInfo: जब फुल ऑब्जेक्ट ग्राफ रिस्टोरेशन चाहिए, कॉम्प्लेक्स सर्कुलर रेफरेंसेज, डीसीरियलाइजेशन भी आवश्यक हो
सीमाएं
- बैक रेफरेंस डीसीरियलाइजेशन पर रिस्टोर नहीं होता (नल रहता है)
- केवल डायरेक्ट पेरेंट-चाइल्ड के लिए काम करता है, कॉम्प्लेक्स ग्राफ्स के लिए नहीं
- नाम मैन्युअली मैच करना पड़ता है कॉम्प्लेक्स केसेस में