2014-09-30 47 views
1

我想将使用Jackson扩展列表的对象转换为Json。 例子:Java对象将列表扩展为Json与Jackson

public class TryToSerialize extends ArrayList<String> 
{ 
    private int number; 
    private String word; 

    public TryToSerialize(){ 
     number = 0; 
     word = ""; 
    } 

    @JsonProperty 
    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 
    @JsonProperty 
    public String getWord() { 
     return word; 
    } 

    public void setWord(String word) { 
     this.word = word; 
    } 

    @JsonIgnore 
    public String getAsJSON() throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.writeValue(new File("c:\\tts.json"), this); 
     return mapper.writeValueAsString(this) ; 
    } 
} 

当我做这个序列我只会阵列部分。

TryToSerialize tts = new TryToSerialize(); 
    tts.setNumber(10); 
    tts.setWord("Working"); 
    tts.add("first"); 
    tts.add("second"); 
    tts.add("third"); 
    String json = tts.getAsJSON(); 

JSON:

["first","second","third"] 

我正在寻找一种方式来包括对象的其他变量。

回答

1

由于您的对象扩展了其中存在默认序列化行为的类之一,因此您的额外字段将被忽略。

现在,我不清楚的一件事是应该是预期的结果。

如果你期待的结果,如:

{"number":10,"word":"Working","values":["first","second","third"]} 

那么你应该能够做到这一点得益于自定义序列,如以下几点:

public class MySerializer extends JsonSerializer<TryToSerialize> { 
    @Override 
    public void serialize(TryToSerialize toSerialize, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     jgen.writeStartObject(); 
     jgen.writeNumberField("number", toSerialize.getNumber()); 
     jgen.writeStringField("word", toSerialize.getWord()); 
     provider.defaultSerializeField("values", toSerialize.iterator(), jgen); 
     jgen.writeEndObject(); 
    } 
} 

如果你期待一个结果如:

[10,"Working","first","second","third"] 

然后,序列化器将如下所示:

public class MySerializer extends JsonSerializer<TryToSerialize> { 
    @Override 
    public void serialize(TryToSerialize toSerialize, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     jgen.writeStartArray(); 
     jgen.writeNumber(toSerialize.getNumber()); 
     jgen.writeString(toSerialize.getWord()); 
     for (Iterator<String> iterator = toSerialize.iterator(); iterator.hasNext();) { 
      jgen.writeString((String) iterator.next());   
     } 
     jgen.writeEndArray(); 
    } 
} 

然后,在这两种情况下的注释类:

@JsonSerialize(using = MySerializer.class) 

有可能是一个更好的方案,但这应该工作...

+0

真棒工程。你会碰巧知道如何反序列化它? – Winston1987 2014-09-30 17:51:49

+0

您将需要一个自定义的反序列化程序;) – Ceredig 2014-10-02 07:42:29

+0

但是,如果您修改TryToSerialize类以使其委托给ArrayList而不是继承它,那么它不是更好的设计吗? (如果上面引用的两个输出中的第一个是可接受的)。这将(默认)串行化(de)序列化器。 – Ceredig 2014-10-02 07:49:53