2012-12-21 22 views
5

के दौरान अनदेखा की गई है मैं जैक्सन 2.1.0 को कंक्रीट प्रकार की जानकारी के लिए 'भेदभावकर्ता' संपत्ति को देखने के लिए जैक्सन 2.1.0 को निर्देश देने के लिए @JsonTypeInfo का उपयोग कर रहा हूं। यह अच्छी तरह से काम करता है लेकिन deserialization के दौरान पीओजेओ में भेदभाव संपत्ति कोई सेट नहीं है।@JsonTypeInfo संपत्ति POJO deserialization

Jackon के जावाडोक (com.fasterxml.jackson.annotation.JsonTypeInfo.Id) के अनुसार

, यह होना चाहिए:

/** 
* Property names used when type inclusion method ({@link As#PROPERTY}) is used 
* (or possibly when using type metadata of type {@link Id#CUSTOM}). 
* If POJO itself has a property with same name, value of property 
* will be set with type id metadata: if no such property exists, type id 
* is only used for determining actual type. 
*<p> 
* Default property name used if this property is not explicitly defined 
* (or is set to empty String) is based on 
* type metadata type ({@link #use}) used. 
*/ 
public String property() default ""; 

यहाँ एक failling परीक्षण

@Test 
public void shouldDeserializeDiscriminator() throws IOException { 

    ObjectMapper mapper = new ObjectMapper(); 
    Dog dog = mapper.reader(Dog.class).readValue("{ \"name\":\"hunter\", \"discriminator\":\"B\"}"); 

    assertThat(dog).isInstanceOf(Beagle.class); 
    assertThat(dog.name).isEqualTo("hunter"); 
    assertThat(dog.discriminator).isEqualTo("B"); //FAILS 
} 

@JsonTypeInfo(
     use = JsonTypeInfo.Id.NAME, 
     include = JsonTypeInfo.As.PROPERTY, 
     property = "discriminator") 
@JsonSubTypes({ 
     @JsonSubTypes.Type(value = Beagle.class, name = "B"), 
     @JsonSubTypes.Type(value = Loulou.class, name = "L") 
}) 
private static abstract class Dog { 
    @JsonProperty("name") 
    String name; 
    @JsonProperty("discriminator") 
    String discriminator; 
} 

private static class Beagle extends Dog { 
} 

private static class Loulou extends Dog { 
} 

कोई भी विचार है?

उत्तर

14

प्रयोग करें 'दृश्य' तो जैसे संपत्ति:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "discriminator", visible=true) 

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

+0

जैक्सन उपयोगकर्ता मेलिंग सूची से कॉपी/पेस्ट करें, लेकिन यह ठीक है। –

+4

हां; ज्यादातर पाठकों के लाभ के लिए जो सूची में नहीं हैं। – StaxMan

+2

क्या जैक्सन 1.9 में ऐसा करने का कोई तरीका है? – bananasplit

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