java - Json 多态性与 Jackson 和 Json 没有包装对象

标签 java json jersey jackson

我有以下 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 {
        ...
    }

处理请求时,我只希望得到以下输出:

<p></p>

<pre><code>{
    AContent: { ...}
}
</code></pre>

<p></p>

但是,我得到以下输出:

<p></p>

<pre><code>{
    object: {
        AContent: { ...}
    }
}
</code></pre>

<p></p>

元素“AContent”被包装到对象元素中。我不想要通用的包装器对象。我也不想直接在通用对象中设置对象类型。

我想直接在根元素中输出“AContent”。

我们如何通过 Jackson 实现这一目标?

预先感谢您的帮助。

最好的问候,

黄鸭

最佳答案

既然你说你可以为 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();
    }
}

附言我删除了您拥有的对输出没有影响的额外注释。

关于java - Json 多态性与 Jackson 和 Json 没有包装对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39348357/

相关文章:

java - Spring Autowiring 为抽象类提供 null bean

java - 传递空整数作为参数

sql - 如何查询 MySQL JSON 列数据的空值?

java - Jersey 没有加载 index.html

Java 以较弱的访问权限实现接口(interface)方法时出错

javascript - 从 json 读取值

javascript - 对象数组的 Angular JSON 过滤器

java - 使用 @RequestScoped 和 @Produces 将用户实体注入(inject) Jersey 处理程序

java - 将 Jersey 日志记录输出到文件?

Java .jar 不在 Windows 上运行