Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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 当提供的json与目标类的类类型不同时,Jackson不会在反序列化时引发异常_Java_Json_Jackson_Deserialization_Json Deserialization - Fatal编程技术网

Java 当提供的json与目标类的类类型不同时,Jackson不会在反序列化时引发异常

Java 当提供的json与目标类的类类型不同时,Jackson不会在反序列化时引发异常,java,json,jackson,deserialization,json-deserialization,Java,Json,Jackson,Deserialization,Json Deserialization,我有两个类A和B,都有公共getter和构造函数,在构造函数参数上用@JsonCreator和@JsonProperty标记。当提供正确的json时,这两个类都被正确地反序列化。然而,当我提供一个类类型为a的投影的json并尝试将其反序列化为B类型的对象时,我希望抛出一个异常。事实证明,jackson将json反序列化为B类型的对象,但该对象仅为null。这是默认行为吗?我的ObjectMapper只是用新的ObjectMapper创建的。我是否可以以任何方式配置它,使其在所述情况下引发异常 A

我有两个类A和B,都有公共getter和构造函数,在构造函数参数上用@JsonCreator和@JsonProperty标记。当提供正确的json时,这两个类都被正确地反序列化。然而,当我提供一个类类型为a的投影的json并尝试将其反序列化为B类型的对象时,我希望抛出一个异常。事实证明,jackson将json反序列化为B类型的对象,但该对象仅为null。这是默认行为吗?我的ObjectMapper只是用新的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 + '\'' +
            '}';
    }

}
@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类实施:

@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 + '\'' +
            '}';
    }

}
@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);
运行此代码后,不会引发异常,反序列化DAObject包含:{propertyA='null'}

@JsonIgnorePropertiesignoreUnknown=true导致jackson忽略未知属性,反序列化后得到的对象是所有属性都使用默认值初始化的对象,对于非原语,默认值为null

使用required=true在属性丢失时强制Jackson抛出异常

@JsonCreator B@JsonPropertyvalue=propertyB,必需=真字符串propertyB{ this.propertyB=propertyB; } @JsonIgnorePropertiesignoreUnknown=true导致jackson忽略未知属性,反序列化后得到的对象是所有属性都使用默认值初始化的对象,对于非原语,默认值为null

使用required=true在属性丢失时强制Jackson抛出异常

@JsonCreator B@JsonPropertyvalue=propertyB,必需=真字符串propertyB{ this.propertyB=propertyB; } 使用@JsonPropertyrequired=true强制Jackson对缺少的键抛出异常

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

使用@JsonPropertyrequired=true强制Jackson对缺少的键抛出异常

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


你能展示你的类A、B和json,以及你为反序列化Jason而编写的代码吗?@akash我用代码示例更新了帖子。你能展示你的类A、B和json,以及你为反序列化Jason而编写的代码吗?@akash我用代码示例更新了帖子。我明白了,这很有意义。然而,在我的程序中,所谓的类A必须具有@JsonIgnorePropertiesignoreUnknown=true,因为实际响应包含我不需要的更多属性。我是否可以像我在问题中所描述的那样维护@JsonIgnorePropertiesignoreUnknown=true并使用错误的投影类处理json?我明白了,这是有道理的。然而,在我的程序中,所谓的类A必须具有@JsonIgnorePropertiesignoreUnknown=true,因为实际响应包含我不需要的更多属性。我是否可以维护@JsonIgnorePropertiesignoreUnknown=true,并像我在问题中描述的那样使用错误的投影类处理json?虽然不确定它是否真的如预期的那样工作,但我记得在实现中存在一些差距。它确实按照我的需要工作,引发了一个异常,因为缺少必需的字段,我保留了@JsonIgnorePropertiesignoreUnknown=true。虽然不确定它是否真的能按预期工作,但我记得在实现中存在一些漏洞。它确实能完全按照我的需要工作,因此引发了一个异常,因为缺少必需的字段,我保留了@JSONIGNORepropertiesIgnoreUnown=true。