एक ऑब्जेक्ट के साथ जावा ऑब्जेक्ट के लिए जावा ऑब्जेक्ट को बदलने के लिए सबसे अच्छा तरीका क्या है? [डुप्लिकेट]

Nov 03 2020

मैं उन्हें डेटाबेस में सहेजने के लिए जावा ऑब्जेक्ट को Json फॉर्मेट में परिवर्तित कर रहा हूं। जब मुझे डेटाबेस से ये Jsons मिलते हैं, तो मुझे उन्हें उन वस्तुओं में बदलने की आवश्यकता होती है, जिनसे वे आए थे। ऐसा करने के लिए, मैं ऑब्जेक्ट्स के प्रकारों को सहेज रहा हूं और जब मुझे डेटाबेस से Jsons मिलता है तो मैं उनके ऑब्जेक्ट प्रकारों की जांच यदि क्लॉज़ के साथ करता हूं, लेकिन मुझे लगता है कि यह सबसे अच्छा तरीका नहीं है जहां ऑब्जेक्ट्स की कमी होती है। क्या ऐसा करने का सबसे सरल तरीका है?

डेटाबेस तालिका संरचना:

id | json_data | data_type
--------------------------
 1 | "{a:1 ..} | TypeA
--------------------------
 2 | so on.......

जावा उदाहरण के लिए Jsons को जावा वस्तुओं में परिवर्तित करें:

ObjectMapper om = new ObjectMapper();
List<SpringEntityObject> allData = getAllDataFromDB();
for (SpringEntityObject o : allData) {
    if (o.getDataType().equals("TypeA")) {
        TypeA typeA = om.readValue(o.getJsonData(), TypeA.class);
        // there should be a simpler way to do this?
        ....
    } else if (o.getDataType().equals("TypeB")) {
        TypeB typeB = om.readValue(o.getJsonData(), TypeB.class);
        ....
    } ......
    else {....}
}

जवाब

3 SherifBehna Nov 03 2020 at 20:59

आपके पास मुख्य मुद्दा यह हो सकता है कि जब भी आप एक नया वर्ग जोड़ते हैं, तो आपको कोड के इस ब्लॉक को बदलने की आवश्यकता होती है।

आप "data_type" कॉलम में वर्ग का पूरा नाम (नाम स्थान के साथ) स्टोर कर सकते हैं, और कक्षा को गतिशील रूप से प्राप्त करने के लिए Class.forName का उपयोग कर सकते हैं। यह आपको डिसेरिएलाइज़ेशन कोड को बदलने के बिना कक्षाएं जोड़ने की अनुमति देता है, जो रखरखाव में मदद करता है।

for (SpringEntityObject o : allData) {
    Class clazz = Class.forName(o.getDataType());
    Object deserializedObject = om.readValue(o.getJsonData(), clazz);
}

ध्यान दें कि आपको डेटाबेस में वर्ग नामों को सिंक करने की आवश्यकता होगी यदि आप उनका नाम बदलते हैं (स्थानांतरित स्क्रिप्ट के माध्यम से)।