मेरे पास एक समान मुद्दा था, लेकिन यह हाइबरनेट के द्वि-दिशात्मक संबंधों से संबंधित था। मैं रिश्ते के एक पक्ष को दिखाना चाहता था और प्रोग्रामिक रूप से दूसरे को अनदेखा करना चाहता था, जो इस बात पर निर्भर करता था कि मैं किसके साथ काम कर रहा था। यदि आप ऐसा नहीं कर सकते हैं, तो आप बुरा है StackOverflowException
। उदाहरण के लिए, अगर मेरे पास ये वस्तुएं थीं
public class A{
Long id;
String name;
List<B> children;
}
public class B{
Long id;
A parent;
}
parent
अगर मैं ए को देख रहा हूं, तो मैं प्रोग्राम को बी में फील्ड को नजरअंदाज करना चाहूंगा और children
अगर मैं बी को देख रहा हूं तो ए में फील्ड को नजरअंदाज कर दूंगा ।
मैंने ऐसा करने के लिए मिश्रणों का उपयोग करना शुरू कर दिया, लेकिन यह बहुत जल्दी भयानक हो जाता है; आपके पास बहुत सारे बेकार वर्ग हैं जो केवल डेटा को प्रारूपित करने के लिए मौजूद हैं। : मैं एक क्लीनर तरीके से इस संभाल करने के लिए अपने खुद के serializer लेखन समाप्त हो गया https://github.com/monitorjbl/json-view ।
यह आपको प्रोग्राम करने की अनुमति देता है कि किन क्षेत्रों को अनदेखा करें:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);
List<A> list = getListOfA();
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(B.class, match()
.exclude("parent")));
यह आपको वाइल्डकार्ड मैचर्स के माध्यम से आसानी से बहुत सरल दृष्टिकोण बताने की सुविधा देता है:
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(A.class, match()
.exclude("*")
.include("id", "name")));
मेरे मूल मामले में, माता-पिता / बच्चे के बारे में नंगे न्यूनतम दिखाने के लिए इस तरह के सरल विचारों की आवश्यकता थी, लेकिन यह हमारी भूमिका-आधारित सुरक्षा के लिए भी उपयोगी हो गया। ऑब्जेक्ट के बारे में कम जानकारी वापस करने के लिए आवश्यक वस्तुओं के कम विशेषाधिकार प्राप्त विचार।
यह सब धारावाहिक से आता है, लेकिन मैं अपने ऐप में स्प्रिंग एमवीसी का उपयोग कर रहा था। इन मामलों को ठीक से संभालने के लिए, मैंने एक एकीकरण लिखा है जिसे आप मौजूदा स्प्रिंग नियंत्रक कक्षाओं में छोड़ सकते हैं:
@Controller
public class JsonController {
private JsonResult json = JsonResult.instance();
@Autowired
private TestObjectService service;
@RequestMapping(method = RequestMethod.GET, value = "/bean")
@ResponseBody
public List<TestObject> getTestObject() {
List<TestObject> list = service.list();
return json.use(JsonView.with(list)
.onClass(TestObject.class, Match.match()
.exclude("int1")
.include("ignoredDirect")))
.returnValue();
}
}
दोनों मावेन सेंट्रल पर उपलब्ध हैं। मुझे आशा है कि यह किसी और की मदद करता है, यह जैक्सन के साथ एक विशेष रूप से बदसूरत समस्या है जो मेरे मामले के लिए एक अच्छा समाधान नहीं था।