2013-08-14 10 views
12

के साथ जेएसओएन फील्ड डुप्लिकेट मैं वसंत के साथ जेएसओएन (डी) क्रमबद्धता के लिए जैक्सन का उपयोग कर रहा हूं। हालांकि मुझे कुछ मामलों में एक क्षेत्र में दो बार होने का मुद्दा है।जैक्सन

public class EpubBookmarkJsonModel extends AbstractBookmarkJsonModel { 
    private static final long serialVersionUID = 1L; 
    // Removed other fields for brevity 

    public EpubBookmarkJsonModel() { 
     this.mimeType = "application/epub+zip"; 
    } 
} 

समस्या यह है कि जब मैं इस JSON को क्रमानुसार, मैं एक नकली mimeType क्षेत्र मिलता है:

सार का विस्तार

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "mimeType") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = ImageBookmarkJsonModel.class, name = "image/jpeg"), 
    @JsonSubTypes.Type(value = EpubBookmarkJsonModel.class, name = "application/epub+zip") 
}) 
public abstract class AbstractBookmarkJsonModel extends AbstractJsonModel { 
    protected String mimeType; 
    // Removed other fields for brevity 

    public String getMimeType() { 
     return mimeType; 
    } 

    public void setMimeType(String mimeType) { 
     this.mimeType = mimeType; 
    } 

    @Override 
    public String toString() { 
     ObjectMapper mapper = new ObjectMapper(); 

     try { 
      return mapper.writeValueAsString(this); 
     } catch (IOException e) { 
      throw new IllegalStateException("Cannot convert object of type " + this.getClass().toString() + " to JSON", e); 
     } 
    } 
} 

और एक ठोस वर्ग:

मैं एक अमूर्त वर्ग है

{ 
    "mimeType": "application/epub+zip", 
    "mimeType": "application/epub+zip", 
    "userId": 24, 
    "acid": "ACID-000000000029087", 
    "added": "2013-08-14T12:02:17Z", 
    "epubBookmarkId": 34, 
    "cfi": "epubcfi(/6/4!/2/68)", 
    "context": "CONTEXT" 
} 

मैंनेकी सिफारिश का उपयोग करने का प्रयास किया हैanswers@JsonAutoDetect एनोटेशन का उपयोग करने के लिए यह निर्दिष्ट करने के लिए कि केवल कक्षा में फ़ील्ड का उपयोग किया जाना चाहिए और साथ ही इसे ObjectMapper पर सेट करना चाहिए, हालांकि यह समस्या को ठीक नहीं करता है।

एनोटेशन:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, 
     setterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE, 
     isGetterVisibility = JsonAutoDetect.Visibility.NONE) 

ObjectMapper:

ObjectMapper mapper = new ObjectMapper(); 
    mapper.getSerializationConfig().getDefaultVisibilityChecker() 
      .withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
      .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
      .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
      .withCreatorVisibility(JsonAutoDetect.Visibility.NONE); 
+0

मैं अगर यह उपयोगी है या नहीं पता नहीं है, लेकिन अगर आप एनोटेशन '@JsonTypeInfo (प्रयोग = JsonTypeInfo.Id.NAME निकालने के लिए, = शामिल JsonTypeInfo.As.PROPERTY, property = "mimeType") 'AbstractBookmarkJsonModel' से आपके पास आपके जेसन – Katona

उत्तर

5

यह व्यवहार वर्ग AbstractBookmarkJsonModel पर रखा एनोटेशन के कारण होता है:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "mimeType") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = ImageBookmarkJsonModel.class, name = "image/jpeg"), 
    @JsonSubTypes.Type(value = EpubBookmarkJsonModel.class, name = "application/epub+zip") 
}) 

@JsonTypeInfo बताता जैक्सन तार्किक प्रकार का नाम क्रमानुसार करने (JsonTypeInfo.Id.NAME) एक समर्थक के रूप में perty (JsonTypeInfo.As.PROPERTY) नाम mimeType (property = "mimeType") के साथ। @JsonSubTypes.Type के साथ आप तार्किक नाम application/epub+zip से EpubBookmarkJsonModel असाइन करें।

यह क्रमबद्धता की बात आती है, जैक्सन एक संपत्ति mimeType = "application/epub+zip" के रूप में तार्किक नाम serializes तो उन के बीच में ऑब्जेक्ट के गुणों को mimeType जो तार्किक नाम application/epub+zip (निर्माता में सौंपा) के रूप में एक ही मूल्य है होता है।

मुझे लगता है कि mimeType या @JsonTypeInfo एनोटेशन में objectType को बदला जाना चाहिए और भी बेहतर mimeType क्षेत्र को दूर करने के बाद जैक्सन के माध्यम से प्रकार की जानकारी क्रमबद्धता से यह ठीक हो जाएगा।

+1

+1 में केवल एक ही 'माइम टाइप' होगा, यह सही जवाब है, जैक्सन सीरियलाइज्ड JSON आउटपुट में अतिरिक्त संपत्ति जोड़ता है उप प्रकार की पहचान करें। आपके मामले में आप किसी मौजूदा प्रॉपर्टी का उपयोग करने का प्रयास करते हैं, तो आपको ऐसा नहीं करना चाहिए। मुझे पता है कि आप वर्ग से 'माइम टाइप' संपत्ति को नहीं हटा सकते हैं क्योंकि मुझे लगता है कि आपको इसकी आवश्यकता है। बस एक अन्य उप प्रकार की जानकारी संपत्ति का नाम 'subtypeName'' का उपयोग करें और उप प्रकार के नाम "' ImageBookmark' "और" 'EpubBookmark'" जैसे कुछ का उपयोग करें। यह जैक्सन पॉलिमॉर्फिक टाइप हैंडलिंग का इच्छित उपयोग है। –

6

मुझे डुप्लिकेट आउटपुट के साथ यह वही समस्या हो रही थी। मुझे एक समाधान मिला जिसमें एक और संपत्ति शामिल नहीं थी, और मुझे मूल संपत्ति को हटाने की अनुमति नहीं दी। सबसे पहले, मैंने JsonTypeInfo के लिए दृश्यमान ध्वज को सही पर सेट किया है। फिर, मैंने संपत्ति घोषणा और गेटर (लेकिन सेटटर नहीं) में एक जेसन इग्नोर एनोटेशन जोड़ा। यह अभी तक प्रकार की संपत्ति के लिए केवल एक कुंजी के साथ JSON को सही ढंग से आउटपुट कर रहा है।

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true, property = "mimeType") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = ImageBookmarkJsonModel.class, name = "image/jpeg"), 
    @JsonSubTypes.Type(value = EpubBookmarkJsonModel.class, name = "application/epub+zip") 
}) 
public abstract class AbstractBookmarkJsonModel extends AbstractJsonModel { 
    @JsonIgnore 
    @JsonProperty("mimeType") 
    protected String mimeType; 

    @JsonIgnore 
    @JsonProperty("mimeType") 
    public String getMimeType() { 
     return mimeType; 
    } 

    @JsonProperty("mimeType") 
    public void setMimeType(String mimeType) { 
     this.mimeType = mimeType; 
    } 

} 

ध्यान दें करने के लिए, यह मैं @JsonTypeInfo एनोटेशन में JsonTypeInfo.As.EXISTING_PROPERTY का उपयोग करके इस हल fasterxml जैक्सन जैक्सन-DataBind 2.1.1

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.1.1</version> 
</dependency> 
15

के साथ है।

परियोजना है खुला स्रोत, यह पता यहाँ की जाँच करें: ANS.java

+1

अच्छा समाधान, @JsonTypeInfo पर दृश्य = सत्य के साथ (यदि नहीं, संपत्ति क्रमबद्ध करने के बाद शून्य है) –

+0

यह मेरी राय में स्वीकार्य उत्तर होना चाहिए। यह जैक्सन का सबसे साफ उपयोग है। –

+0

यह "toJson()" पर काम करता था, लेकिन जब मैंने कोशिश की "सेजसन()" फ़ील्ड को "शून्य" मान के साथ छोड़ दिया गया था। कोई विचार? – ozma