2012-05-29 16 views
10

का उपयोग कर addional रैपिंग जोड़ने के लिए मैं है निम्नलिखित वर्ग:फोर्स जैक्सन एनोटेशन

public class Message { 
    private String text; 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    }  
} 

जब JSON करने के लिए उदाहरण परिवर्तित डिफ़ॉल्ट रूप से जैक्सन का उपयोग कर रहा है:

{"text":"Text"} 

मैं चाहते हैं पाने के लिए:

{"message":{"text":"Text"}} 

कोई JAXB/जैक्सन एनोटेशन मैं अपने लक्ष्य को प्राप्त करने का उपयोग कर सकते है?

समाधान के लिए, मैं एक वर्ग के साथ मेरी कक्षा लपेट कर सकते हैं:

public class MessageWrapper { 
    private Message message; 

    public Message getMessage() { 
     return message; 
    } 

    public void setMessage(Message message) { 
     this.message = message; 
    } 
} 

या एक अधिक सामान्य समाधान:

public class JsonObjectWrapper<T> { 
    /** 
    * Using a real map to allow wrapping multiple objects 
    */ 
    private Map<String, T> wrappedObjects = new HashMap<String, T>(); 

    public JsonObjectWrapper() { 
    } 

    public JsonObjectWrapper(String name, T wrappedObject) { 
     this.wrappedObjects.put(name, wrappedObject); 
    } 

    @JsonAnyGetter 
    public Map<String, T> any() { 
     return wrappedObjects; 
    } 

    @JsonAnySetter 
    public void set(String name, T value) { 
     wrappedObjects.put(name, value); 
    } 
} 

इसलिए की तरह इस्तेमाल किया जा सकता कौन सा:

Message message = new Message(); 
message.setText("Text"); 
JsonObjectWrapper<Message> wrapper = new JsonObjectWrapper<Message>("message", message); 

कोई JAXB/जैक्सन एनोटेशन मैं प्राप्त करने के लिए उपयोग कर सकते हैं है मेरा लक्ष्य?

धन्यवाद।

उत्तर

12

वैकल्पिक हल पर: यदि आप पूरी तरह उन getters/setters जरूरत नहीं है, तो बस हो सकता है:

public class MessageWrapper { 
    public Message message; 
} 

या शायद सुविधा निर्माता जोड़ें:

public class MessageWrapper { 
    public Message message; 
    @JsonCreator 
    public MessageWrapper(@JsonProperty("message") Message m) { 
     message = m; 
    } 
} 

रैपिंग जोड़ने के लिए एक तरीका नहीं है भी; 1.9 के साथ आप SerializationConfig.Feature.WRAP_ROOT_ELEMENT और DeserializationConfig.Feature.UNWRAP_ROOT_ELEMENT का उपयोग कर सकते हैं। और तुम आवरण नाम बदलने के लिए (डिफ़ॉल्ट रूप से यह बस अयोग्य वर्ग का नाम है) चाहते हैं तो आपको @JsonRootName एनोटेशन

जैक्सन 2.0 ObjectReader और ObjectWriter के माध्यम से आगे गतिशील विकल्प है, साथ ही JAX-आरएस एनोटेशन कहते हैं का उपयोग कर सकते हैं।

+0

StaxMan, अगर JSON स्ट्रिंग के मूल तत्व नाम क्रमबद्धता के दौरान उपेक्षा किया जाना है, जैक्सन करता है 1.9 हमें 'DeserializationConfig.Feature.UNWRAP_ROOT_ELEMENT' अकेले सुविधा या एनोटेशन' के अलावा स्थापित करने के लिए आवश्यकता होती है @JsonRootName 'भी आवश्यक है? – asgs

+1

मुझे सत्यापित करना होगा - UNWRAP पर्याप्त हो सकता है; सवाल यह है कि क्या नाम को मानचित्र बनाना है या नहीं। लेकिन '@ जेसन रूट नाम' के बिना भी, डिफ़ॉल्ट नाम मौजूद है (सरल वर्ग का नाम), जो अच्छी तरह से काम कर सकता है। – StaxMan

+0

यह काम किया! बहुत बहुत धन्यवाद। – asgs

4

यह जानकर दुखी था कि आपको एक लेबल वाले ऑब्जेक्ट के साथ कक्षा को लपेटने के सरल लक्ष्य के लिए कस्टम क्रमबद्धता लिखनी होगी। कस्टम सीरिएलाइज़र लिखने के साथ खेलने के बाद, मैंने निष्कर्ष निकाला कि सबसे सरल समाधान एक सामान्य रैपर है।

public final class JsonObjectWrapper { 
    private JsonObjectWrapper() {} 

    public static <E> Map<String, E> withLabel(String label, E wrappedObject) { 
     HashMap<String, E> map = new HashMap<String, E>(); 
     map.put(label, wrappedObject); 
     return map; 
    } 
} 
0

एक सरल/बेहतर तरीका यह करने के लिए:

@JsonRootName(value = "message") 
public class Message { ...} 

तो का उपयोग
new ObjectMapper().configure(SerializationFeature.WRAP_ROOT_VALUE, true).writeValueAs...

2

बशर्ते आप कोई आपत्ति नहीं है यहाँ शायद ऊपर अपने उदाहरण का एक और अधिक सरल कार्यान्वयन है json message में एक राजधानी m होने, यह करने के लिए तो सबसे आसान तरीका @JsonTypeInfo के साथ अपने वर्ग टिप्पणी करने के लिए है।

आप जोड़ना होगा:

@JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME)` 
public class Message { 
    // ... 
} 

{"Message":{"text":"Text"}}

0

पाने के लिए वसंत का उपयोग कर, तो application.properties फ़ाइल ऐड में हैं निम्नलिखित: -

spring.jackson.serialization.WRAP_ROOT_VALUE = सच

और फिर अपने किसी भी वर्ग पर @JsonRootName एनोटेशन का उपयोग करें जिसे आप क्रमबद्ध करना चाहते हैं। जैसे

@JsonRootName("user") 
public class User { 
    private String name; 
    private Integer age; 
} 
संबंधित मुद्दे