• 2014-03-30

    Jackson雕虫技(四)

    Tag:jackson

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/270174350.html

    Jackson雕虫技(一)
    Jackson雕虫技(二)
    Jackson雕虫技(三)

    忽略空字段

    有时候,我们返回对象的字段可能会有为空的情况。缺省情况下,这些字段会以null的形式呈现出来。但如果我们希望忽略这些字段该如何处理呢?如果是针对某个具体的类,我们可以使用JsonInclude这个annotation。

    @JsonInclude(JsonInclude.Include.NON_NULL)
    class Entity {
       ...
    }

    如果所有类都能够遵循这样的规则,那就要在全局配置了,配在Object Mapper上:

      mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

    Joda-Time

    在《你应该更新的Java知识》里面,我推荐大家在Java 8之前使用Joda Time,而非JDK原生的Date和Calendar。但是,如果我们使用了Joda Time,到了Jackson该怎么办呢?

    Java对象和JSON的相互转换,只是一个序列化和反序列化的过程。我们在之前的雕虫技中已经见识过如何针对自己的类自定义序列化和反序列化。所以,本质上来说,为Joda Time自定义一套,自然也不是什么难事。不过,通用如Joda Time这样的程序库,自然也应该有现成的支持。我们直接拿过来用就好了。

    实际上,Jackson已经为Joda Time提供了官方支持。如果你和我一样喜欢Gradle,下面就是依赖的添加方式,其中,jacksonVersion自然是Jackson的版本号。

      "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jacksonVersion"

    有了依赖,我们只要在Object Mapper上注册一个模块即可。

      mapper.registerModule(new JodaModule());

    现在就可以自己的对象里使用DateTime、LocalDate、LocalTime这样的类型了,有了JodaModule,Jackson就会为我们照顾好这些类型的转换。

    我们习惯的日期表示方式一般是年月日时分秒,但Joda Time缺省的做法却是一个数字,一个以毫秒为单位计算出的数字,它叫时间戳。如果你希望让它变成我们喜欢的样子,可以这样做:

      mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

    如果你还让自己的日期表现方式中加入时区,那就再加上时区:

      mapper.setTimeZone(TimeZone.getDefault());

    Guava

    同样在《你应该更新的Java知识》,我还提到一个观点,只要是Java项目就应该使用Guava。我也展示过Guava中一些库的用法。我现在已经无可救药地爱上了Guava中的不变集合。但同Joda Time一样,Guava不是标准的JDK的一部分,也需要额外的支持。值得高兴的是,这个支持也有现成的,也来自Jackson的官方,依赖如下:

      "com.fasterxml.jackson.datatype:jackson-datatype-guava:$jacksonVersion"

    同样,它也要Object Mapper上注册一个模块。

      mapper.registerModule(new GuavaModule());

    如此一来,Jackson就可以支持Guava提供的大部分内容,包括Optional和一些不变集合,以及一些新增的集合。

    分享到:
    引用地址: