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

当提供的json的类类型不同于目标类时,Jackson不会在反序列化时抛出异常

杨乐意
2023-03-14

我有两个类AB,它们都有公共getter和构造函数,在构造函数参数上用@JSONCreator@JSONProperty标记。当提供正确的json时,这两个类都被正确反序列化。但是,当我提供一个json(类类型a的投影)并尝试将其反序列化为B类型对象时,我希望会抛出一个异常。结果是,jackson将json正确反序列化为B类型对象,但这个对象只是空的。这是默认的行为吗?我的ObjectMapper是使用new ObjectMapper()创建的。我可以以任何方式配置它,使它在描述的情况下抛出异常吗?

A类实现:

@JsonIgnoreProperties(ignoreUnknown = true)
final class A {

    private final String propertyA;

    @JsonCreator
    A(@JsonProperty("propertyA") String propertyA) {
        this.propertyA = propertyA;
    }

    public String getPropertyA() {
        return propertyA;
    }

    @Override
    public String toString() {
        return "A{" +
            "propertyA='" + propertyA + '\'' +
            '}';
    }

}

B类实现:

@JsonIgnoreProperties(ignoreUnknown = true)
final class B {

    private final String propertyB;

    @JsonCreator
    B(@JsonProperty("propertyB") String propertyB) {
        this.propertyB = propertyB;
    }

    public String getPropertyB() {
        return propertyB;
    }

    @Override
    public String toString() {
        return "B{" +
            "propertyB='" + propertyB + '\'' +
            '}';
    }

}

具有B类投影的Json:{“PropertyB”:“PropertyBValue”}

String jsonWithBObject = "{\"propertyB\":\"propertyBValue\"}";

A deserializedAObject = mapFromJsonToObject(jsonWithBObject, A.class);
private <T> T mapFromJsonToObject(String json, Class<T> targetClass) {
    try {
        return objectMapper.readValue(json, targetClass);
    } catch (JsonProcessingException exception) {
        throw new RuntimeException();
    }
}

并且运行此代码后,不会引发异常,DeserializDAObject包含:A{propertya='null'}

共有1个答案

傅志诚
2023-03-14

使用@jsonproperty(required=true)对丢失的键强制Jackson抛出异常

仅部分支持此属性。摘自Jackson Javadoc:

 Note that as of 2.6, this property is only used for Creator
 Properties, to ensure existence of property value in JSON:
 for other properties (ones injected using a setter or mutable
 field), no validation is performed. Support for those cases
 may be added in future.
 类似资料:
  • 序列化和反序列化的方式不同于 我已经创建了两个序列化程序 和 我用Jackson查看了序列化/反序列化映射 ,但找不到解决方案。

  • 我想实现一个功能,其中请求映射到正确的对象。是否有一种方法(除了自定义反序列化器)可以将请求按类型/基数映射到适当的对象?任何见解都将不胜感激!

  • 问题内容: 我正在尝试使用Gson 反序列化a ,值的类型可以变化,值“ in_wanted”可以是a 或a 。 in_wanted为: in_wanted为: 每当“ in_wanted”的值为布尔值时,我都需要该对象,并且需要一个反序列化器以返回null。用Gson做到这一点的最佳方法是什么? 问题答案: 您可以使用自定义解串器来完成此操作。首先,我们应该创建可以表示您的JSON的数据模型。

  • 我有一个REST API,它返回JSON响应为: 有时它会返回: 我有一个这样的POJO: 那么,有没有办法(除了编写自己的自定义反序列化程序)在 Jackson2 中帮助我将 JSON 中的通道映射到字符串类型(当它是时)和类型(当它是 JSON 对象时)? 或者换句话说,Jackson中是否有一种方法可以通过变量的映射,而不仅仅是通过?

  • 我得到了json文件和第三方类:Dealer和接口IDealerAttributes(我不能更改它们中的任何一个);(我删除包名并导入以使代码简单) 一旦我使用: 我将从这一行得到异常: 我如何读取这个基于Dealer.class、IdeAlerAttributes的json文件? 但我可以添加一个类,假设: 因为我是JSON/GSON的新手,你能给我详细的指导来帮助我吗?多谢了。 [添加]考虑一

  • 我正在将RedditAPI中的一些内容反序列化到POJO中。我的目标是尽可能简化代码,因为reddit中实体之间的JSON结构通常是相同的。 例如,反序列化链接对象的JSON如下所示: 我可以反序列化这一点没有问题,但由于reddit注释的不同之处在于其类型为t1,并且在其下方的数据对象中具有不同的结构,因此我希望将相同的类结构重新用于JSON包装,而不必创建多个具有一行或两行差异的复制类。 我创