जैक्सन वास्तव में कुछ विचित्र कर रहा है और मुझे इसके लिए कोई स्पष्टीकरण नहीं मिल रहा है। मैं polymorphic serialization कर रहा हूँ और यह पूरी तरह से काम करता है जब एक वस्तु अपने आप पर है। लेकिन यदि आप एक ही वस्तु को एक सूची में डालते हैं और इसके बजाय सूची को क्रमबद्ध करते हैं, तो यह प्रकार की जानकारी मिटा देता है।जैक्सन पॉलिमॉर्फिक धारावाहिक सूचियों में क्यों काम नहीं करता है?
तथ्य यह है कि यह टाइपिंग जानकारी खो रहा है, जिससे किसी को टाइप एरर पर संदेह होगा। लेकिन यह सूची के सामग्री के क्रमिकरण के दौरान हो रहा है; सभी जैक्सन को करना है कि वर्तमान वस्तु का निरीक्षण करें, यह इसके प्रकार को निर्धारित करने के लिए क्रमबद्ध है।
मैं एक उदाहरण जैक्सन 2.5.1 का उपयोग कर बना लिया है:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
public class Test {
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
@Type(value = Dog.class, name = "dog"),
@Type(value = Cat.class, name = "cat")})
public interface Animal {}
@JsonTypeName("dog")
public static class Dog implements Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@JsonTypeName("cat")
public static class Cat implements Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws JsonProcessingException {
List<Cat> list = new ArrayList<>();
list.add(new Cat());
System.out.println(new ObjectMapper().writeValueAsString(list));
System.out.println(new ObjectMapper().writeValueAsString(list.get(0)));
}
}
यहाँ उत्पादन है:
[{"name":null}]
{"@type":"cat","name":null}
आप देख सकते हैं, जैक्सन प्रकार की जानकारी को जोड़ने नहीं है जब वस्तु है एक सूची में क्या किसी को पता है कि ये क्यों हो रहा है?
इसके अलावा, आप 'नई ObjectMapper() की तरह उपयोग कर सकते हैं writerFor (mapper.getTypeFactory() constructCollectionType (List.class, पशु।। कक्षा))। लिखें वैल्यूएस्ट्रिंग (सूची) ' –
यह वास्तव में अजीब है, और मैं कल्पना नहीं कर सकता कि वे यह विकल्प क्यों बनायेंगे। सूची के प्रकार के बावजूद, आपको लगता है कि इसके अंदर की वस्तुओं को हर समय समान रूप से क्रमबद्ध किया जाएगा। – monitorjbl
mapper.writerWithType (mapper.getTypeFactory()। BuildCollectionType (List.class, Animal.class))। लिखें ValueAsString (सूची) – Youness