当前位置: 首页 > 知识库问答 >
问题:

父/子类通过jackson反序列化失败

岳卓君
2023-03-14
@JsonTypeInfo
(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
)
@JsonSubTypes
({
   @JsonSubTypes.Type(value = SomeProduct.class, name = Product.PRODUCT_TYPE_SOME)
})
public abstract class Product
{
    static final String PRODUCT_TYPE_SOME = "some_product";
}
public class SomeProduct extends Product
{
    @JsonProperty("status")
    @JsonSerialize(include =  JsonSerialize.Inclusion.NON_DEFAULT)
    private int status;

    public int getStatus()
    {
        return status;
    }

    public void setStatus(int status)
    {
        this.status = status;
    }
}

将有更多的类(不同的产品)扩展product

当我使用objectmapper序列化它时,

ObjectMapper mapper = new ObjectMapper();

Product p = new SomeProduct();
String json = mapper.writeValueAsString(p);

这是输出:

Product x = mapper.convertValue(json, Product.class);

将引发此异常:

java.lang.IllegalArgumentException:意外的标记(VALUE_STRING),应为field_name:缺少包含类型id(类com.shubham.model.product的)的属性“type”,位于[源:n/a;行:-1,列:-1]

我在这里做错了什么?我观察了一下,发现了一个问题,在JsonTypeInfo中使用了DefaulTimpl。但是我不能将json反序列化回“默认IMPL”,因为json对于特定的实现总是有效的。

使用Jackson 2.4.3

共有1个答案

曾飞雨
2023-03-14

您错误地使用了mapper.convertvalue(json,product.class);。您应该使用:mapper.readvalue(json,product.class);

convertValue使用:

用于从给定值到给定值类型的实例的两步转换的方便方法,如果(但仅当!)需要转换。如果给定的值已经属于请求的类型,则按原样返回值。

 类似资料:
  • 好的,我知道有一堆类似的问题,但似乎都行不通。 我为我的实体设置了以下结构。 在我的控制器中,我尝试将一个请求映射到下面的方法。 请尝试%1 我认为它是这样做的--添加了一个元数据属性,该属性将存储子类类。 结果是什么。 结果是什么。 即使将和添加到这两个子类中,也会得到相同的结果。 其他尝试 我试了很多。什么都不起作用。不会包含这里的所有内容。 我觉得应该有一个简单的方法来做到这一点,但我只是不

  • 我试图通过Kotlin使用Jackson对lastfm api提供的xml进行反序列化。我用JAXB在Java中实现了这一点,我正在尝试移植它。除以下示例中的“未包装列表”字段外,所有功能都正常工作。我知道Track数据类正在工作,因为如果我使用而不是

  • 在下面的示例中,我有一个主类-A和它的子类-B。两者都可以用作一般类X中的属性。 如何使用Jackson多态特性将以下给定的json正确反序列化为各自的类: JSON A: JSON B: 预期结果:将keys对象映射到JSON A的类A和JSON B的类B。 请提出其他建议。

  • 我正在尝试使用JSON ObjectMapper反序列化对象。我在尝试反序列化时看到以下错误

  • 我有以下JSON: 这基本上是一个包含项集合的对象。 所以我做了一个类来反序列化: 我尝试添加,但没有成功。 怎么走?

  • 假设我有以下格式的JSON: 我试图避免自定义反序列化程序,并试图将上述JSON(称为Wrapper.java)反序列化为JavaPOJO。“type”字段指示“object”反序列化,即type=foo表示使用foo.java反序列化“object”字段。(如果type=Bar,则使用Bar.java反序列化对象字段)。Metadata/owner将始终以相同的方式对每个元数据使用简单的带Jac