2013-10-17 78 views
1

我正在尋找將字段注入到JSON中,我正在從POJO序列化。我正在使用Jackson來執行序列化,並且我可以創建一個客戶序列化程序來注入該字段。我至今是:在JSON序列化中注入字段

public class Main { 
    public static void main(String[] args) throws IOException { 

     Child newChild = new Child(); 
     newChild.setName("John"); 

     ObjectMapper mapper = new ObjectMapper(); 

     SimpleModule module = new SimpleModule("Custom Child Serializer", new Version(1,0,0,null)); 
     module.addSerializer(new CustomChildSerializer()); 
     mapper.registerModule(module); 

     System.out.println(mapper.writeValueAsString(newChild)); 
     System.in.read(); 
    } 
} 

class CustomChildSerializer extends SerializerBase<Child> { 
    public CustomChildSerializer() { 
     super(Child.class); 
    } 

    @Override 
    public void serialize(Child child, JsonGenerator jgen, SerializerProvider serializerProvider) throws IOException, JsonGenerationException { 
     jgen.writeStartObject(); 
     jgen.writeStringField("Name", child.getName()); 
     jgen.writeStringField("Injected Value","Value"); 
     jgen.writeEndObject(); 
    } 
} 

class Child { 
    private String Name; 
    public String getName() { return Name; } 
    public void setName(String name) { Name = name; } 
} 

假設Child是一類,它是一個API的一部分,我不能修改它。有沒有辦法可以修改自定義序列化程序來使用Child類的默認序列化,以便Child更改時,我不必修改自定義序列化程序?

+0

爲什麼使用自定義序列化程序,例如看起來你可以簡單地使用沒有自定義序列化程序的對象映射程序。如果您試圖解決一些更復雜的問題,並且您不能修改Child對象來說添加註釋。您可以使用jackson mixin添加序列化參數,而無需手動序列化對象。 –

+0

@ChrisHinshaw我的理解是,Mixins不支持添加字段,而是映射現有數據。在這種情況下,我無法修改'Child'類,因爲它是從外部API返回給我的數據。 –

+0

您正在使用哪個版本的Jackson?你能用最新的 - 2.2.3嗎? –

回答

1

您可以將對象轉換爲Map添加其他屬性並序列化完整的地圖。見下面的序列化程序:

class CustomChildSerializer extends JsonSerializer<Child> { 

    ObjectMapper mapper = new ObjectMapper(); 
    MapType type = mapper.getTypeFactory().constructMapType(Map.class, String.class, String.class); 

    @Override 
    public void serialize(Child child, JsonGenerator jgen, SerializerProvider serializerProvider) 
      throws IOException, JsonGenerationException { 
     Map<String, String> map = mapper.convertValue(child, type); 
     map.put("Injected Value", "Value"); 

     jgen.writeObject(map); 
    } 

    @Override 
    public Class<Child> handledType() { 
     return Child.class; 
    } 
} 
+0

我的例子使用2.2.3版本。也許最老的版本不支持這個功能。我不知道。我從來沒有使用過這個庫的最舊版本。也許你需要添加額外的註釋/ ObjectMapper配置來啓用此功能。這不是我建議使用最新版本的傑克遜的問題。 –

+0

對不起。我沒有注意到它。我改變了我的答案。 –

相關問題