Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Jackson的Json多态性和不带包装器对象的Json多态性_Java_Json_Jersey_Jackson - Fatal编程技术网

Java 带Jackson的Json多态性和不带包装器对象的Json多态性

Java 带Jackson的Json多态性和不带包装器对象的Json多态性,java,json,jersey,jackson,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"

我有以下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: { ...}
}
@JsonSerialize(using = ResponseSerializer.class)
public class Response<T> {
    private T object;  
    ...
}

但是,我得到以下输出:

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

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

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

我们怎样才能和杰克逊一起做到这一点

提前谢谢你的帮助

致以最良好的祝愿


Yellow duck

既然您说过可以为A和B提供基本实体,那么解决方案将是:

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();
    }
}
和序列化程序:

公共类响应序列化程序扩展JsonSerializer{
@凌驾
public void serialize(响应值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException、JsonProcessingException{
类responseClass=value.getObject().getClass();
JavaType responseJavaType=serializers.constructType(responseClass);
gen.writeStartObject();
gen.writeFieldName(serializers.findTypeSerializer(responseJavaType).getTypeIdResolver().idFromValue(value.getObject());
序列化(value.getObject(),gen,serializers);
/*在这里,您必须手动序列化其他属性*/
/*像gen.writeStringField(“property”,value.getProperty())*/
writeEndObject将军();
}
}

另外,我删除了对输出没有影响的额外注释。

至于序列化,您可以始终使用自定义序列化程序跳过请求并直接转到对象,但反序列化更为棘手。我希望jersey/jackson能够自动序列化对象。有没有可能通过jackson注释实现这一点?如果你能引入A和B的基本实体,还有另一个解决方案。我可以引入A和B的基本实体。这个解决方案是什么?你能举个例子吗?提前感谢您的帮助。非常感谢你,基米。它与带有JsonTypeInfo和JsonSubTypes注释的公共基实体以及getObject()方法上的JsonValue注释完美配合。此解决方案(JsonValue注释)存在一个问题:我在请求bean中再也看不到其他属性。例如,在Request类中,如果我添加了一个新属性,它将不会显示在json结果中。@yellowduck您的问题没有表明响应中有其他属性,这就是我认为JsonValue足够的原因。无论如何,我用一个使用自定义序列化程序的答案替换了我的答案,至少有了它,您可以手动序列化其他属性。而且,恐怕这是你能得到的最好的解决方案,至少是我能做到的最好的。我不知道是否有更好的解决方案,但它可以通过扩展JsonSerializer来工作。谢谢@chimmi的帮助。你是great@yellowduck如果我的解决方案适用于你,考虑接受我的答案。