java - codehaus jackson ObjectReader 的反序列化功能

标签 java jackson deserialization

如何为对象读取器应用反序列化功能 (FAIL_ON_UNKNOWN_PROPERTIES)?我知道如何为 objectMapper 完成它,但是如何在 codehaus jackson 中的 objectReader 上完成它?

最佳答案

自从 Jackson 引入了一些版本 ObjectReader#with 实现你想要的方法。也许迁移到更高版本会更容易。

但是,如果您不能使用更高版本,您可以使用 ObjectMapper#configure 设置此功能。方法。将此功能设置为 true 后你可以创建ObjectReader来自 ObjectMapper reader 方法。

正如您在 ObjectReader 的文档中看到的那样创建后无法更改其功能。但是读者不共享映射器状态。因此,如果您需要从一个映射器创建多个读取器,并且只有少数读取器需要此选项,您可以在 ObjectMapper 中设置功能。只为他们。您可以像这样获取该功能的当前状态

boolean enabled = mapper.getDeserializationConfig().isEnabled(feature);

改变状态然后恢复到原来的状态。参见 createReader(Class<T> clazz, DeserializationConfig.Feature feature)示例中的方法。

这是我们要反序列化的 POJO

class ExamplePojo {
    private int a1;
    private String b1;

    public ExamplePojo() {

    }

    public ExamplePojo(int a1, String b1) {
        this.a1 = a1;
        this.b1 = b1;
    }

    public int getA1() {
        return a1;
    }

    public void setA1(int a1) {
        this.a1 = a1;
    }

    public String getB1() {
        return b1;
    }

    public void setB1(String b1) {
        this.b1 = b1;
    }
}

这是一个例子

import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectReader;
import org.codehaus.jackson.map.exc.UnrecognizedPropertyException;

public class JacksonExample {

    static ObjectMapper mapper = new ObjectMapper();

    public static <T> ObjectReader createReader(Class<T> clazz, DeserializationConfig.Feature feature) {
        boolean enabled = mapper.getDeserializationConfig().isEnabled(feature);

        mapper.configure(feature, true);
        ObjectReader reader = mapper.reader(clazz);
        mapper.configure(feature, enabled);

        return reader;
    }

    public static <T> ObjectReader createReader(Class<T> clazz) {
        return mapper.reader(clazz);
    }

    public static void main(String[] args) throws Exception {

        // by default turn off this feature
        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        // Should fail
        ObjectReader r1 = createReader(ExamplePojo.class, DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
        try {
            ExamplePojo ex = r1.readValue("{\"a1\":1,\"b1\":\"Hello!\",\"c1\":1}");
            System.out.println(ex.getA1() + " " + ex.getB1());
        } catch (UnrecognizedPropertyException ex) {
            System.out.println(ex.getMessage());
        }

        // Should be ok
        ObjectReader r2 = createReader(ExamplePojo.class);
        try {
            ExamplePojo ex = r2.readValue("{\"a1\":2,\"b1\":\"Hello!\",\"c1\":2}");
            System.out.println(ex.getA1() + " " + ex.getB1());
        } catch (UnrecognizedPropertyException ex) {
            System.out.println(ex.getMessage());
        }

        // Should fail
        try {
            ExamplePojo ex = r1.readValue("{\"a1\":3,\"b1\":\"Hello!\",\"c1\":3}");
            System.out.println(ex.getA1() + " " + ex.getB1());
        } catch (UnrecognizedPropertyException ex) {
            System.out.println(ex.getMessage());
        }

        // Should be ok
        try {
            ExamplePojo ex = r2.readValue("{\"a1\":4,\"b1\":\"Hello!\",\"c1\":4}");
            System.out.println(ex.getA1() + " " + ex.getB1());
        } catch (UnrecognizedPropertyException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

这个例子的输出

Unrecognized field "c1" (Class ExamplePojo), not marked as ignorable at [Source: java.io.StringReader@7c30a502; line: 1, column: 29] (through reference chain: ExamplePojo["c1"])

2 Hello!

Unrecognized field "c1" (Class ExamplePojo), not marked as ignorable at [Source: java.io.StringReader@49e4cb85; line: 1, column: 29] (through reference chain: ExamplePojo["c1"])

4 Hello!

关于java - codehaus jackson ObjectReader 的反序列化功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33207282/

相关文章:

java - 如何为使用 xjc :javaType 自定义的元素生成 @XmlSchemaType

java - 我怎样才能为 Java 服务器拥有多个 SSL 证书

android jackson json对象映射器数组反序列化

带有属性的 XML 中的 C# XML 反序列化 XML

c# - 如何在 XML 反序列化期间将 XML 字符串保留为字符串字段

java - 如何用其他内容替换此 "if"语句?

java - Logger.getGlobal() 和 Logger.getAnonymousLogger() 之间的区别?

xml - Jackson 或 JAXB,哪个更适合 JSON?

java - 如何在 Jackson 的 XmlMapper 中强制关闭标记为空或 null 值?

java - 如何使用 Spring WebClient 反序列化通用响应