2017-08-01 19 views
5

क्या जैक्सन में के लिए उपयोग कर @JsonTypeInfo और @JsonSubTypes एनोटेशन कर रहे हैं के लिए उपयोग किया जाता है क्या?@JsonTypeInfo और @JsonSubTypes जैक्सन

public class Lion extends Animal { 

private String name; 

@JsonCreator 
public Lion(@JsonProperty("name") String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public String getSound() { 
    return "Roar"; 
} 

public String getType() { 
    return "carnivorous"; 
} 

public boolean isEndangered() { 
    return true; 
} 

@Override 
public String toString() { 
    return "Lion [name=" + name + ", getName()=" + getName() + ", getSound()=" + getSound() + ", getType()=" + getType() + ", isEndangered()=" 
      + isEndangered() + "]"; 
} 

} 

========================================

public class Elephant extends Animal { 

@JsonProperty 
private String name; 

@JsonCreator 
public Elephant(@JsonProperty("name") String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public String getSound() { 
    return "trumpet"; 
} 

public String getType() { 
    return "herbivorous"; 
} 

public boolean isEndangered() { 
    return false; 
} 

@Override 
public String toString() { 
    return "Elephant [name=" + name + ", getName()=" + getName() + ", getSound()=" + getSound() + ", getType()=" + getType() 
      + ", isEndangered()=" + isEndangered() + "]"; 
} 
} 

==============================================

@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "classNameExtenral") 
@JsonSubTypes ({@Type (value = Lion.class, name = "lion"), @Type (value = Elephant.class, name = "elephant")}) 

public abstract class Animal { 

@JsonProperty ("name") 
String name; 
@JsonProperty ("sound") 
String sound; 
@JsonProperty ("type") 
String type; 
@JsonProperty ("endangered") 
boolean endangered; 
} 

public static void main(String[] args){ 
    Lion lion = new Lion("Simba"); 
    Elephant elephant = new Elephant("Manny"); 
    List<Animal> animals = new ArrayList<>(); 
    animals.add(lion); 
    animals.add(elephant); 
} 

क्या मैं समझता हूँ कि यह अतिरिक्त वस्तु की ठोस प्रकार को बरकरार रखता है वास्तविक डेटा के साथ धारावाहिक की जा रही है।

मुझे क्या स्पष्ट नहीं है deserialization के दौरान वास्तविक लाभ/लाभ क्या है।

नहीं जावा डॉक्स से अलग किसी भी महत्वपूर्ण प्रलेखन रही है। क्या कोई 1 कृपया यहां मदद कर सकता है या इसके आसपास कुछ दस्तावेज़ प्रदान कर सकता है।

+0

हो सकता है कि इस जवाब में मदद मिलेगी: https://stackoverflow.com/a/31666888/751579 – davidbak

+0

यह मदद करता है .. धन्यवाद। – Harshit

उत्तर

6

इन एनोटेशन का उद्देश्य deserialization पर polymorphism का समर्थन करना है। जब वास्तविक कोड को निष्पादित किया जा रहा है तो उसे कक्षा पता चल जाएगा। उदाहरण के लिए, कुछ क्षेत्र का प्रकार deserialized किया जा रहा है। लेकिन अगर उस वर्ग में उप-वर्ग हैं (यानी, उपप्रकार) जेनेरिक जैक्सन deserializer कैसे पता चलता है कि स्ट्रिंग deserialized कौन सा वास्तविक वर्ग है? इसे कुछ ठोस प्रकार (कक्षा या इसके उप-वर्गों में से एक) का उदाहरण बनाना है और इसे भरना है। एकमात्र तरीका यह जान सकता है कि कौन सा निर्माण करना है यदि वह जानकारी लिखित को पहले स्थान पर क्रमबद्ध करने में लिखा गया है।

this answer के रूप में कहते हैं वहाँ यह करने के लिए तीन तरीके हैं - आप एक है कि आपके उपयोग के मामले के लिए उपयुक्त है उठाओ। @JsonTypeInfo + @JsonSubtypes उन तरीकों में से एक है - यह बहुत अच्छा काम करता है जब आप जानते हैं, संकलन समय पर, संभव उपप्रकार है कि प्रश्न में वर्ग के लिए मौजूद सकता है के सभी।

+0

व्यक्तिगत कंक्रीट कक्षाओं पर @JsonTypeInfo का उपयोग नहीं कर रहा है और अधिक समझ में आता है? इंटरफ़ेस पर इसका उपयोग करना मुझे लगता है कि खुले बंद सिद्धांत का उल्लंघन करना प्रतीत होता है (जैसा कि हमें ठोस कार्यान्वयन के हर नए जोड़े पर हमारे इंटरफ़ेस को संशोधित करने की आवश्यकता है)। अगर मुझे कुछ याद आ रहा है तो कृपया मुझे सही करें – Harshit

+0

फिर, यह उपयोग के मामले पर निर्भर करता है। उदाहरण के लिए, मेरे पास एक उपयोग का मामला था जहां मैं वास्तव में एक ही स्थान पर @JsonSubtypes का उपयोग कर सकता था और यह प्रत्येक उप प्रकार को टैग करने के लिए बेहतर था। लेकिन टीबीएच मैं भूल जाता हूं कि उस मामले का उपयोग अब क्या था; मुझे याद है कि यह सामान्य से थोड़ा सा था। लेकिन शुद्ध ओ-ओ सिद्धांत की तुलना में व्यावहारिक तैनाती/रिलीज मुद्दों के साथ इसका अधिक संबंध था। (याद रखें: किसी भी खुले पास की तरह "सिद्धांत" सिर्फ एक मजबूत दिशानिर्देश है ... आप कुछ मामलों में पा सकते हैं कि इस तरह के एक सिद्धांत का उल्लंघन सही डिजाइन है - बस सुनिश्चित करें कि आप वास्तव में पता क्यों बनाते हैं।) – davidbak

+1

पर विचार करें यदि आप एक वर्ग केज है जिसमें पशु प्रकार का एक क्षेत्र होता है। जब जेजॉन से पिंजरे की वस्तु को deserialized किया जाता है, जैक्सन को पता चलता है कि यह एक पशु बनाना चाहिए, तो अगर पशु @JsonTypeInfo के साथ एनोटेट नहीं किया गया है, तो जैक्सन polymorphism के लिए समर्थन लागू नहीं करेगा, और इसलिए यह केवल पशु (यदि संभव हो) बना देगा और इसके उप प्रकार नहीं। –

संबंधित मुद्दे