1

POJO からシリアライズしている JSON にフィールドを挿入しようとしています。Jackson を使用してシリアライゼーションを実行しており、フィールドを注入する顧客シリアライザーを作成できます。私がこれまでに持っているものは次のとおりです。

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にカスタムシリアライザーを変更する必要がないようにする方法はありますか?

4

1 に答える 1

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;
    }
}
于 2013-10-18T00:15:15.533 に答える