7

次のgsonシリアル化をJACKSONシリアル化に変換しようとしています。JACKSONで動作させるために何を変更する必要があるか教えてください

public class AbstractElementAdapter 
    implements JsonSerializer<AbstractElement>, JsonDeserializer<AbstractElement>
{
    @Override
    public JsonElement serialize(AbstractElement src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject result = new JsonObject();
        JsonObject properties = context.serialize(src, src.getClass()).getAsJsonObject();

        if (src instanceof TruncatedElement) {
            result.add("type", new JsonPrimitive(((TruncatedElement) src).getClassName()));
            properties.remove("className");
        } else {
            result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
        }

        result.add("properties", properties);

        return result;
    }

    @Override
    public AbstractElement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String type = jsonObject.get("type").getAsString();
        JsonElement element = jsonObject.get("properties");

        try {
            return context.deserialize(element, Class.forName("com.zreflect.emyed.whiteboard.model.element." + type));
        } catch (ClassNotFoundException cnfe) {
            throw new JsonParseException("Unknown element type: " + type, cnfe);
        }
    }
}
4

2 に答える 2

2

次のようなカスタムシリアライザーを作成できます。

  public class ItemSerializer extends JsonSerializer<AbstractElement> {
        @Override
        public void serialize(AbstractElement src, JsonGenerator jgen, SerializerProvider provider)
                throws IOException, JsonProcessingException {
            jgen.writeStartObject();

            if (src instanceof TruncatedElement) {
                jgen.writeStringField("type",((TruncatedElement) src).getClassName());
                jgen.writeObjectFieldStart("properties");
                //use  jgen.writeStringField();  
                //jgen.writeNumberField(); 
                //etc to every one of the values, 
                //but skipping className
                 jgen.writeEndObject();


            } else {
                jgen.writeStringField("type", src.getClass().getSimpleName() );
                //write everythin
                jgen.writeObjectField("properties", src);
            }

            jgen.writeEndObject();
        }
    }

それを ObjectMapper に登録してから、シリアル化を行います。

ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule();
module.addSerializer(yourObject.class, new ItemSerializer());
mapper.registerModule(module);

String serialized = mapper.writeValueAsString(yourObject);

スキップのトリックにはclassName、カスタム フィールド フィルターを使用することもできます。ここに素晴らしい例があります: http://www.baeldung.com/jackson-ignore-properties-on-serialization

于 2015-10-30T13:25:08.193 に答える
1

Jackson では、アノテーションを使用してシリアライザーを指定できます。たとえば、以下の簡単な例を参照してください。

@JsonSerialize(using FooToStringSerializer)
public class Foo implements Serializable {

    private String bar;

    public Foo(String bar) {
        this.bar = bar;
}

次に、オブジェクトがいつシリアライズされたかを確認したい場合は、シリアライザーbarを次のように作成します。

public class FooToStringSerializer extends JsonSerializer<Foo> {

    @Override
    public void serialize(final Foo value, final JsonGenerator jgen,
        final SerializerProvider provider) throws IOException
    {
        jgen.writeObject(value.getBar());
    }

デシリアライズの場合、デシリアライザーを作成し、デシリアライズを実行する に登録できますObjectMapper

デシリアライザーをオブジェクト マッパーに登録するには、次の手順を実行します。

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Item.class, new FooDeserializer());
mapper.registerModule(module);

カスタム デシリアライゼーションのわかりやすい例については、次のリンクを参照してください: http://www.baeldung.com/jackson-deserialization

于 2015-10-30T13:16:20.927 に答える