2011-08-08 23 views
10

मैं निम्नलिखित वर्गों मिल गया है की विशेषताओं लपेट नहीं है:जैक्सन JSON नेस्टेड वस्तु

public class Container { 
    private String name; 
    private Data data; 
} 

public class Data { 
    private Long id; 
} 

जब मैं जैक्सन का उपयोग कर Container वर्ग को क्रमानुसार मैं

{"name":"Some name","data":{"id":1}} 

मिल लेकिन मैं परिणाम की जरूरत होने के लिए:

{"name":"Some name","id":1} 

यह (Container.getDataId() विधि जोड़ने के बिना) संभव है? यदि हां, तो यह कैसे करें?


अद्यतन

मैं कस्टम JsonSerializer<Data> बनाने की कोशिश की है, लेकिन जैसा कि पहले

public class JsonDataSerializer extends JsonSerializer<Data> { 

    private static Logger logger = Logger.getLogger(JsonDataSerializer.class); 

    @Override 
    public void serialize(Data value, JsonGenerator jgen, 
      SerializerProvider provider) 
      throws IOException,JsonProcessingException { 

     Long id = (value.getId() == null) ? 0l : value.getId(); 
     jgen.writeStartObject(); 
     jgen.writeNumberField("id", id); 
     jgen.writeEndObject(); 
     logger.debug("Data id " + id + " serialized to JSON.");  
    } 
} 

मैं भी Data श्रेणी से ऊपर @JsonSerialize टिप्पणी जोड़ने के लिए कोशिश की है परिणाम एक ही था, तो Container कक्षा में गेटटर के ऊपर। जैसा कि मैंने बिना किसी सफलता के पहले उल्लेख किया था। मेरा serializer का उपयोग किया जाता है, लॉगजर लॉग संदेश।


अद्यतन 2

जब मैं writeStartObject() और writeEndObject() को दूर तो कोई JSON, returnesd है केवल HTTP Status 500 त्रुटि और कोई अपवाद नहीं है कि मैं क्या डिबग आउटपुट में पाए जाने वाले को छोड़कर फेंक दिया है।

DEBUG: org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [[email protected]]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value 
DEBUG: org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [[email protected]]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value 
DEBUG: org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [[email protected]]: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value 
+0

क्या हुआ अगर आप writeStartObject() और writeEndObject() लाइनों को छोड़ क्या होता है? –

+1

आप शायद सिर्फ मूल्य लिखना चाहिए: writeNumber (आईडी) –

+0

हाँ, का उपयोग करते हुए सिर्फ 'writeNumber (आईडी) writting' कम से कम कुछ मामले के लिए काम किया। आउटपुट '" डेटा था ": 1'। लेकिन क्या होगा यदि मैं 'डेटा' कक्षा में एक और विशेषता को क्रमबद्ध करना चाहता हूं? मैं 'के साथ और' लिखने {प्रारंभ, समाप्ति} Object' बिना उत्तर के लिए कोई भाग्य के साथ – kurochenko

उत्तर

9

जैक्सन 1.9 JsonUnwrapped एनोटेशन जो आप के लिए क्या देख रहे करता पेश किया है:

एक serializer वर्ग निर्दिष्ट करें।

0

मुझे लगता है कि आप बना सकते हैं और डेटा प्रकार के लिए एक कस्टम serializer रजिस्टर करना होगा।

आप डेटा वर्ग पर @JsonSerialize एनोटेशन का उपयोग कर सकते हैं।

@JsonSerialize(using = MyDataSerializer.class) 
public class Data { 
    ... 
} 

public static class MyDataSerializer extends JsonSerializer<Data> { 

    @Override 
    public void serialize(Data value, JsonGenerator jgen, 
      SerializerProvider provider) throws IOException,JsonProcessingException { 
     jgen.writeNumberField("id", value.id); 
    } 
+0

धन्यवाद जोड़ने Field' तरीकों लिखना * करने की कोशिश की है! मैं तुम क्या लिखा है (अद्यतन सवाल देखें) करने के लिए कोशिश की है, लेकिन दुर्भाग्य से परिणाम पहले की तरह ही है। – kurochenko

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