`
干宝周
  • 浏览: 14626 次
社区版块
存档分类
最新评论

Jackson序列化object时的一个坑

阅读更多

概要

这几天,我们的系统里连续出现了2个故障,故障原因很简单。我们在domain里平增了一个get方法,但是这个get方法并不是一般JAVA Bean里的getter/setter.
对这个domain进行JSON序列化时,jackson抛出了null pointer异常。

如果在Jackson序列化时将REQUIRE_SETTERS_FOR_GETTERS 设置为true,可以解决这个问题。

原因 && 解决方法

产生这个问题的根本原因是,以上的两个常见的JSON序列化工具在序列化domain时,会调用domain里的所有get方法。

解决这个事情的解决方法有很多

  1. 最好不要在domain里写复杂的处理逻辑
  2. 写public方法时,需要做非空校验
  3. 写的public方法换一个名字,不以get 开头

对于jackson来说,最好的解决方法是,给ObjectMapper增加一个配置

objectMapper.configure(SerializationConfig.Feature.REQUIRE_SETTERS_FOR_GETTERS, true);

REQUIRE_SETTERS_FOR_GETTERS 的说明

如果这个配置为false时,只有存在对应的构造器、setter或者field时,才调用getter。代码里的注释是

        /**
         * Feature that determines whether getters (getter methods)
         * can be auto-detected if there is no matching mutator (setter,
         * constructor parameter or field) or not: if set to true,
         * only getters that match a mutator are auto-discovered; if
         * false, all auto-detectable getters can be discovered.
         *<p>
         * Feature is disabled by default for backwards compatibility
         * reasons.
         * 
         * @since 1.9
         */
        REQUIRE_SETTERS_FOR_GETTERS(false),

测试代码

以上配置的测试代码是

public class JacksonTest extends TestCase{

    private static ObjectMapper objectMapper;

    Foo foo = new Foo();

    @Test
    public void testOriginMapper() throws  Exception{
        objectMapper = new ObjectMapper();

        try {
            objectMapper.writeValueAsString(foo);
            failBecauseExceptionWasNotThrown(NullPointerException.class);
        } catch (Exception e) {
            assertThat(e).hasMessageContaining("NullPointerException");
        }
    }

    @Test
    public void testNoGetter() throws  Exception{
        objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationConfig.Feature.REQUIRE_SETTERS_FOR_GETTERS, true);

        assertThat(objectMapper.writeValueAsString(foo)).isEqualTo("{\"name\":null,\"age\":null}");
    }
}

class Foo {
    String name;

    Integer age;

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getTrimName() {
        return name.trim();
    }
}

分享到:
评论

相关推荐

    jackson json序列化,反序列化所需jar包

    要使用Jackson库进行JSON序列化,你需要创建一个`ObjectMapper`实例,然后调用其`writeValueAsString()`方法。例如: ```java ObjectMapper mapper = new ObjectMapper(); MyObject obj = new MyObject(); String ...

    fastJosn Gson Jackson 序列化和反序列化所需要的jarlib.rar

    Jackson是由FasterXML公司维护的一个高性能的JSON处理库,它提供了一整套完善的解决方案,包括流式API(JsonParser/JsonGenerator)、树模型API(JsonNode)以及对象映射API( ObjectMapper)。Jackson的优点在于其...

    Json序列化时动态处理属性

    例如,当对象的某个属性可能不存在,但我们需要在序列化或反序列化时忽略它,可以使用`$`符号来引用。例如,`JSON.parseObject(json, new TypeReference, Object&gt;&gt;(){},{})`,这里的`{}`表示空的映射策略,意味着...

    fastjson、gson、jackson序列化和反序列化所用 json

    Jackson还支持注解驱动的映射,允许开发者通过注解来控制序列化和反序列化的具体行为。 这三个库各有特点,Fastjson以其速度和简洁性脱颖而出,Gson则以其灵活性和对复杂类型的处理能力受到青睐,而Jackson则在功能...

    序列化与反序列化

    在Java中,可以使用`java.io.Serializable`接口标记一个类为可序列化的,然后使用`ObjectOutputStream`来序列化对象,而`ObjectInputStream`则用于反序列化。 在描述的"序列化与反序列化Demo"中,我们可以推测这...

    Json序列化与反序列化详解

    Jackson是另一个广泛使用的Java JSON库,它提供了一套完整的解决方案,包括流式API、树模型API和注解驱动的映射API: ```java // 序列化 ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper....

    Jackson实现Object对象与Json字符串的互转

    - 使用`ObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)`可以避免序列化时包含null值,提升性能。 ### 异常处理 在序列化和反序列化过程中可能会遇到错误,例如类型不匹配、字段缺失等。...

    Json反序列化

    在"TestJson"这个例子中,可能包含了一个或多个测试用例,用于检验JSON反序列化的正确性。这可能是一个简单的JSON字符串,或者是一个包含复杂嵌套结构的JSON对象。开发者通常会编写测试代码,模拟从服务器获取JSON...

    java 常用序列化和反序列化框架使用demo

    在Java中,`java.io.Serializable`接口用于标记一个类是可序列化的。然而,Java标准库提供的序列化机制效率较低且安全性欠佳,因此出现了许多第三方框架来优化这一过程。本篇将介绍几个常用的Java序列化和反序列化...

    Jackson进行JSON的序列化与反序列化案例教程.docx

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,已经成为了广泛使用的数据序列化和反序列化的格式之一。 跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换...

    Java Json序列化与反序列化

    Java中的JSON(JavaScript Object Notation)序列化与反序列化是开发过程中常见且重要的操作,主要用于数据交换和存储。JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在...

    Java实现序列化例子

    在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口,尽管该接口没有任何方法需要实现,但它的存在就标志着这个类的对象可以被序列化。 首先,我们来看一下`SerializableDemo`这...

    支持javax.money数据类型的JSON序列化和反序列化

    在Java开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和...在处理涉及货币数据的RESTful服务、微服务通信或任何需要JSON序列化的场景下,它都是一个非常实用的工具。

    java 序列化

    - **Jackson**:它是一个快速、功能丰富的JSON库,提供了多种方式(如JsonNode、POJO、流API等)处理JSON数据,同时支持JSON序列化和反序列化。 - **Gson**:Google开发的库,能够直接将Java对象转换为JSON字符串...

    json序列化与反序列化demo

    在Java世界里,为了方便地进行JSON的序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象),有多个库提供了强大的支持,其中包括Gson、Jackson、Fastjson以及LoganSquare。接下来,我们将...

    Java对象的序列化与反序列化Java开发Java经验技巧

    - 除了Java内置的序列化机制,还可以使用JSON(JavaScript Object Notation)进行序列化,例如Gson、Jackson和Fastjson等库,它们能将Java对象转换成JSON字符串,方便在网络间传输,并且更易于人类阅读。...

    jackson所需jar包

    Jackson-all-2.8.0.jar是这个压缩包中的核心文件,它是Jackson库的一个综合包,包含了序列化、反序列化、流式处理等各种功能的实现。通过引入这个JAR文件,开发者可以直接在Spring MVC 4.3框架中使用Jackson提供的...

    Json 数据格式化 jackson

    它包含`ObjectMapper`类,这是一个强大的工具,可以方便地处理JSON序列化和反序列化任务,支持各种配置选项和转换策略。 2. **jackson-core-2.9.0.jar**:这个模块提供了JSON解析和生成的基础功能,包括流式API...

    jackson 实体转json 为NULL或者为空不参加序列化(实例讲解)

    但是,如果我们有一个Map对象,即使我们对ObjectMapper对象进行了相同的设置,Map对象中键值对的值为null时,这个键值对还是会被包含在序列化的JSON中。 总结来说,通过以上两种方法,我们可以轻松地控制在使用...

    Java下利用Jackson进行JSON解析和序列化示例

    除了基本的序列化和反序列化功能,Jackson还支持多种高级特性,比如自定义序列化器和反序列化器、处理复杂数据结构等。对于需要处理JSON数据的Java开发者来说,熟练掌握Jackson是非常有必要的。

Global site tag (gtag.js) - Google Analytics