簡體   English   中英

Json多態性與Jackson和Json沒有包裝對象

[英]Json polymorphism with Jackson and Json without wrapper object

我有以下Java bean:



    /**
     * The top container. It uses generics.
     */
    public class Response {
      @JsonTypeInfo(
          use = JsonTypeInfo.Id.NAME,
          include = JsonTypeInfo.As.WRAPPER_OBJECT,
          property = "type"
      )
      @JsonSubTypes({
        @JsonSubTypes.Type(name = "AContent", value = A.class),
        @JsonSubTypes.Type(name = "BContent", value = B.class),        
      })  
      private E object;
    }

    /**
     * First type
     */ 
    @JsonRootName("AContent")
    public class A {
        ...
    }

    /**
     * Second type
     */ 
    @JsonRootName("BContent")
    public class B {
        ...
    }

處理請求時,我只期望以下輸出:

{
    AContent: { ...}
}

但是,我得到以下輸出:

{
    object: {
        AContent: { ...}
    }
}

元素“AContent”被包裝到object元素中。 我不想要泛型的包裝器對象。 我也不想直接在通用對象中設置對象類型。

我想直接在根元素內輸出“AContent”。

我們怎樣才能與傑克遜達成協議?

在此先感謝您的幫助。

最好的祝福,

黃鴨

既然你說你可以為A和B提供基本實體,解決方案將是:

@JsonSerialize(using = ResponseSerializer.class)
public class Response<T> {
    private T object;  
    ...
}

基礎實體(其他人必須擴展它):

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.WRAPPER_OBJECT
)
@JsonSubTypes({
        @JsonSubTypes.Type(name = "AContent", value = EntityA.class),
        @JsonSubTypes.Type(name = "BContent", value = EntityB.class),
})
public class Entity {
    ...
}

和序列化器:

public class ResponseSerializer extends JsonSerializer<Response> {
    @Override
    public void serialize(Response value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        Class<?> responseClass = value.getObject().getClass();
        JavaType responseJavaType = serializers.constructType(responseClass);
        gen.writeStartObject();
        gen.writeFieldName(serializers.findTypeSerializer(responseJavaType).getTypeIdResolver().idFromValue(value.getObject()));
        serializers.findValueSerializer(responseClass).serialize(value.getObject(), gen, serializers);
        /* Here you must manually serialize other properties */
        /* Like gen.writeStringField("property", value.getProperty()); */
        gen.writeEndObject();
    }
}

PS我刪除了你沒有輸出的額外注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM