Java 使用Jackson将JSON反序列化为字符串中的包装JSON

Java 使用Jackson将JSON反序列化为字符串中的包装JSON,java,json,jackson,Java,Json,Jackson,我收到了JSON和字符串包装JSON的混合。 例如: 我想用不同的对象类型反序列化它 abstract class Shape { } @Data class Rectangle extends Shape { private int w; private int h; } @Data class Circle extends Shape { private int radius; } @Data class NodeParent { private In

我收到了JSON和字符串包装JSON的混合。 例如:

我想用不同的对象类型反序列化它

abstract class Shape {
}

@Data
class Rectangle extends Shape {
    private int w;
    private int h;
}

@Data
class Circle extends Shape {
    private int radius;
}

@Data
class NodeParent {

    private Integer type;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = Rectangle.class, name = "1"),
            @JsonSubTypes.Type(value = Circle.class, name = "2")
    })
    private Shape shape;
}

@Data
class Root {

    private List<NodeParent> shapes;

}
抽象类形状{
}
@资料
类矩形扩展形状{
私人int w;
私有inth;
}
@资料
类圆形延伸形状{
私有整数半径;
}
@资料
类节点分离{
私有整数类型;
@JsonTypeInfo(使用=JsonTypeInfo.Id.NAME,包括=JsonTypeInfo.As.EXTERNAL_属性,PROPERTY=“type”)
@JsonSubTypes({
@JsonSubTypes.Type(value=Rectangle.class,name=“1”),
@JsonSubTypes.Type(value=Circle.class,name=“2”)
})
私人造型;
}
@资料
类根{
私有列表形状;
}
这种方法适用于普通的JSON(没有字符串包装)

但对于我的有效载荷,它失败了,因为它在“形状”中看到了一条字符串。我可以为此使用自定义反序列化程序。但我必须在那里绘制所有类型的地图。我宁愿使用注释


可以这样做吗?

好的,除了“shape”字段之外,自定义反序列化程序可以委托给所有的标准反序列化程序。顺便问一下,你为什么会收到转义的形状信息?如果你是定义API的人,我只要求发送者不要这样做。看起来内部
圆圈
矩形
被双重时间序列化为
JSON
。第一个:
Object->JSON String
,第二个:
JSON String->JSON String
。您可以向每个类型的静态方法中添加如下内容:
@JsonCreator public static Circle of(String value)抛出IOException{return mapper.readValue(value,Circle.class);}
。对于
矩形
,它看起来可能是一样的
mapper
是受保护的静态ObjectMapper mapper=new ObjectMapper()
Shape
类中声明。也许更简单的解决方案是在转移到反序列化过程之前避开
JSON
abstract class Shape {
}

@Data
class Rectangle extends Shape {
    private int w;
    private int h;
}

@Data
class Circle extends Shape {
    private int radius;
}

@Data
class NodeParent {

    private Integer type;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = Rectangle.class, name = "1"),
            @JsonSubTypes.Type(value = Circle.class, name = "2")
    })
    private Shape shape;
}

@Data
class Root {

    private List<NodeParent> shapes;

}