2011-12-07 16 views
6

मैं जैक्सन क्रमबद्धता/deserialization के साथ experementing हूँ। उदाहरण के लिए, मैं इस तरह के वर्ग हैं:जैक्सन जटिल सूची क्रमबद्धता

class Base{ 
    String baseId; 
} 

और मैं सूची objs क्रमानुसार करने चाहते हैं; जैक्सन के साथ ऐसा करने के लिए, जावा प्रकार के मिटाए जाने के कारण, मुझे एक सूची के तत्व वास्तविक प्रकार निर्दिष्ट करने की आवश्यकता है। इस कोड काम करेगा:

List<Base> data = getData(); 
return new ObjectMapper().writerWithType(TypeFactory.collectionType(List.class, Base.class)).writeValueAsString(data); 

अब, मैं और अधिक जटिल वर्ग को क्रमानुसार हैं:

class Result{ 
    List<Base> data; 
} 

मैं जैक्सन कैसे बता ठीक से इस वर्ग को क्रमानुसार करने चाहिए?

+1

नोट: मूल प्रश्न में उदाहरण कोड में TypeFactory का उपयोग अनुशंसित नहीं है। इसके बजाय, mapper.getTypeFactory()। BuildCollectionType() का उपयोग करें। –

+0

मुझे लगता है कि निर्माण CollectionType तर्क के रूप में सूची निर्दिष्ट करने का तरीका नहीं था। Thats क्यों मैंने वहाँ संग्रह टाइप किया था। – tmp120210

उत्तर

14

बस

new ObjectMapper().writeValueAsString(myResult); 

सूची के प्रकार उसी तरह यह पहला उदाहरण में होगा में टाइप विलोपन के कारण खो नहीं किया जाएगा।


ध्यान दें कि एक सूची या सामान्य सूची के वेनिला क्रमबद्धता के लिए, यह आवश्यक नहीं है सूची घटक प्रकार निर्दिष्ट करने के लिए, के रूप में मूल प्रश्न में उदाहरण में बताया गया है। निम्नलिखित तीन उदाहरण धारावाहिकताएं उसी JSON के साथ List<Bar> का प्रतिनिधित्व करती हैं।

import java.util.ArrayList; 
import java.util.List; 

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectWriter; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Baz baz = new Baz("BAZ", 42); 
    Zab zab = new Zab("ZAB", true); 
    List<Bar> bars = new ArrayList<Bar>(); 
    bars.add(baz); 
    bars.add(zab); 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 

    String json1 = mapper.writeValueAsString(bars); 
    System.out.println(json1); 
    // output: 
    // [{"name":"BAZ","size":42},{"name":"ZAB","hungry":true}] 

    Foo foo = new Foo(bars); 

    String json2 = mapper.writeValueAsString(foo); 
    System.out.println(json2); 
    // output: 
    // {"bars":[{"name":"BAZ","size":42},{"name":"ZAB","hungry":true}]} 

    mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    ObjectWriter typedWriter = mapper.writerWithType(mapper.getTypeFactory().constructCollectionType(List.class, Bar.class)); 

    String json3 = typedWriter.writeValueAsString(bars); 
    System.out.println(json3); 
    // output: 
    // [{"name":"BAZ","size":42},{"name":"ZAB","hungry":true}] 
    } 
} 

class Foo 
{ 
    List<Bar> bars; 
    Foo(List<Bar> b) {bars = b;} 
} 

abstract class Bar 
{ 
    String name; 
    Bar(String n) {name = n;} 
} 

class Baz extends Bar 
{ 
    int size; 
    Baz(String n, int s) {super(n); size = s;} 
} 

class Zab extends Bar 
{ 
    boolean hungry; 
    Zab(String n, boolean h) {super(n); hungry = h;} 
} 

अतिरिक्त टाइप जानकारी के साथ क्रमबद्ध होने पर एक टाइप किया गया लेखक उपयोगी होता है। ध्यान दें कि json1 और json3 नीचे दिए गए आउटपुट अलग-अलग हैं।

import java.util.ArrayList; 
import java.util.List; 

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectMapper.DefaultTyping; 
import org.codehaus.jackson.map.ObjectWriter; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Baz baz = new Baz("BAZ", 42); 
    Zab zab = new Zab("ZAB", true); 
    List<Bar> bars = new ArrayList<Bar>(); 
    bars.add(baz); 
    bars.add(zab); 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    mapper.enableDefaultTypingAsProperty(DefaultTyping.OBJECT_AND_NON_CONCRETE, "type"); 

    String json1 = mapper.writeValueAsString(bars); 
    System.out.println(json1); 
    // output: 
    // [ 
    // {"type":"com.stackoverflow.q8416904.Baz","name":"BAZ","size":42}, 
    // {"type":"com.stackoverflow.q8416904.Zab","name":"ZAB","hungry":true} 
    // ] 

    Foo foo = new Foo(bars); 

    String json2 = mapper.writeValueAsString(foo); 
    System.out.println(json2); 
    // output: 
    // { 
    // "bars": 
    // [ 
    //  "java.util.ArrayList", 
    //  [ 
    //  {"type":"com.stackoverflow.q8416904.Baz","name":"BAZ","size":42}, 
    //  {"type":"com.stackoverflow.q8416904.Zab","name":"ZAB","hungry":true} 
    //  ] 
    // ] 
    // } 

    mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    mapper.enableDefaultTypingAsProperty(DefaultTyping.OBJECT_AND_NON_CONCRETE, "type"); 
    ObjectWriter typedWriter = mapper.writerWithType(mapper.getTypeFactory().constructCollectionType(List.class, Bar.class)); 

    String json3 = typedWriter.writeValueAsString(bars); 
    System.out.println(json3); 
    // output: 
    // [ 
    // "java.util.ArrayList", 
    // [ 
    //  {"type":"com.stackoverflow.q8416904.Baz","name":"BAZ","size":42}, 
    //  {"type":"com.stackoverflow.q8416904.Zab","name":"ZAB","hungry":true} 
    // ] 
    // ] 
    } 
} 
+0

आह ओह, मैं समाधान के बहुत करीब था) मैंने पहली बार एनपीई दिया जब मैंने पहली बार कोशिश की, और मैंने सोचा कि यह काम नहीं करेगा। अब मैंने फिर कोशिश की और सब कुछ काम करता है। धन्यवाद! – tmp120210

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