2016-05-17 64 views
0

我使用jackson的spring引導來提供API。 在我的數據庫中有一個泛化/專業領域。這意味着,我有兩個字段:一個值和一個字段,用於定義值的數據類型。Jackson:序列化EER專業化

所以我的實體是這樣的:

public class Example{ 
    private String value; 
    private String type; 

    // getters and setters 
} 

例如用這三個條目:

"1234";"Integer" 
"example string";"String" 
"true";"Boolean" 

傑克遜序列化此如下:

[{ 
    "value": "1234", 
    "type": "Integer" 
}, 
{ 
    "value": "example string", 
    "type": "String" 
}, 
{ 
    "value": "true", 
    "type": "Boolean" 
}] 

這是我expteced ,但是,我需要這個:

[{ 
    "value": 1234, 
    "type": "Integer" 
}, 
{ 
    "value": "example string", 
    "type": "String" 
}, 
{ 
    "value": true, 
    "type": "Boolean" 
}] 

所以,值應根據「類型」字段的值序列化。 我知道我可以將序列化程序附加到「值」字段,但我無法訪問那裏的「類型」字段以知道如何序列化值。

回答

1

一種選擇是,如果你可以改變你的實例類是這樣的:

public static class Example { 
    private String value; 
    private String type; 

    @JsonIgnore 
    public String getValue() { 
     return value; 
    } 

    @JsonProperty("value") 
    @JsonRawValue 
    public Object getRawValue() { 
     if("String" .equals(type)){ 
      return '"'+ value +'"'; 
     } 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 
} 

或者你可以在Example類使用解串器

public static void main(String[] args) throws JsonProcessingException { 
    ObjectMapper mapper = new ObjectMapper(); 
    SimpleModule module = new SimpleModule(); 
    module.addSerializer(Example.class, new MySerializer()); 
    mapper.registerModule(module); 
    System.out.println(mapper.writeValueAsString(list)); 
} 

private static class MySerializer extends JsonSerializer<Example> { 
    @Override 
    public void serialize(Example value, JsonGenerator gen, SerializerProvider serializers) 
                     throws IOException { 
     gen.writeStartObject(); 

     gen.writeFieldName("value"); 

     if (value.getType().equals("String")) { 
      gen.writeString(value.getValue()); 
     } else { 
      gen.writeRawValue(value.getValue()); 
     } 

     gen.writeStringField("type", value.getType()); 
     gen.writeEndObject(); 
    } 
} 

結果:

[{"value":1234,"type":"Integer"},{"value":"example string","type":"String"},{"value":true,"type":"Boolean"}] 

更新

這裏有一種方法你怎麼可以使用自定義解串器和默認一個每隔領域:

private static class MySerializer extends JsonSerializer<Example> { 
    private static final ObjectMapper internalMapper = new ObjectMapper(); 

    @Override 
    public void serialize(Example value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 
     ObjectNode node = internalMapper.valueToTree(value); 

     if (value.getType().equals("String")) { 
      node.put("value", value.getValue()); 
     } else { 
      node.putRawValue("value", new RawValue(value.getValue())); 
     } 

     gen.writeObject(node); 
    } 
} 

需要有@JsonIgnorepublic String getValue()

+0

嗨!感謝那。 對於期望「value」的所有其他字段,如果沒有明確定義如何處理每個字段,是否也可以使用默認行爲?我的實體有很多字段,我不想在多個類(實體,序列化程序和反序列化程序...)中列出/管理它們全部... – Indivon

+0

@Indivon我用新選項更新了答案,是的,你可以使用默認的反序列化您的自定義解串器。給我一分鐘,我會更新信息 – varren

+0

@Indivon更新了我的文章,看看,可能還有其他一些選擇,你可以嘗試 – varren