Jackson常用配置示例

  • 对输出缩进
  • Fail on Unknown Properties
  • 允许序列化空对象
  • 将空字符串反序列化为 null POJO
  • 空字符串与 Java simple objects
  • 序列化时的时间格式化
  • 原文链接

Jackson 提供了 SerializationFeatureDeserializationFeature 来自定义 ObjectMapper 的行为。

对输出缩进

public class MyObject {private int intVal;private String stringVal;private List<String> list;.............
}

默认配置下的 JSON 输出是没有缩进的:

MyObject myObject = new MyObject(3, "test String",
List.of("one", "two"));
ObjectMapper om = new ObjectMapper();
String s = om.writeValueAsString(myObject);
System.out.println(s);
{"intVal":3,"stringVal":"test String","list":["one","two"]}

可以用 om.enable(..)om.configure(.., true) 开启缩进或其他功能:

MyObject myObject = new MyObject(3, "test String",List.of("one", "two"));
ObjectMapper om = new ObjectMapper();om.enable(SerializationFeature.INDENT_OUTPUT);
// om.configure(SerializationFeature.INDENT_OUTPUT, true);String s = om.writeValueAsString(myObject);
System.out.println(s);
{"intVal" : 3,"stringVal" : "test String","list" : [ "one", "two" ]
}

Fail on Unknown Properties

反序列化时,若遇到未知的属性(没有对应的属性,也没有setter 或 handler来处理这样的属性)会抛出异常,

public class MyObject2 {private int intVal;public MyObject2(int intVal) {this.intVal = intVal;}public MyObject2() {}...
}

默认会报错:

String jsonSting = "{\"intVal\":3,\"strVal\":\"3\"}";
ObjectMapper om = new ObjectMapper();
System.out.println(jsonSting);
MyObject2 myObject = om.readValue(jsonSting, MyObject2.class);
System.out.println(myObject);
{"intVal":3,"strVal":"3"}
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "strVal" (class org.example.c2.MyObject2), not marked as ignorable (one known property: "intVal"])at [Source: (String)"{"intVal":3,"strVal":"3"}"; line: 1, column: 23] (through reference chain: org.example.c2.MyObject2["strVal"])at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:987)at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1974)at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1701)at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1679)at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:330)at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3548)at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3516)at org.example.c2.DisableFailOnUnknownProps.disableFailOnUnknownProps2(DisableFailOnUnknownProps.java:49)at org.example.c2.DisableFailOnUnknownProps.main(DisableFailOnUnknownProps.java:19)

禁用 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES

String jsonSting = "{\"intVal\":3,\"strVal\":\"3\"}";ObjectMapper om = new ObjectMapper();
om.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);System.out.println(jsonSting);
MyObject2 myObject = om.readValue(jsonSting, MyObject2.class);
System.out.println(myObject);
{"intVal":3,"strVal":"3"}
MyObject2{intVal=3}

允许序列化空对象

MyEmptyObject 没有可序列化的属性,Jackson 默认的字段属性发现规则:所有被 public 修饰的字段、所有被 public 修饰的getter。没有可序列化的属性时,会抛出异常。

public class MyEmptyObject {private int i = 10;
}

默认:

MyEmptyObject myObject = new MyEmptyObject();
ObjectMapper om = new ObjectMapper();
String s = om.writeValueAsString(myObject);
System.out.println(s);
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.example.c2.MyEmptyObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276)at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71)at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33)at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4487)at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3742)at org.example.c2.DisableFailOnEmptyBeans.defaultOutput(DisableFailOnEmptyBeans.java:24)at org.example.c2.DisableFailOnEmptyBeans.main(DisableFailOnEmptyBeans.java:17)Process finished with exit code 1

禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS

MyEmptyObject myObject = new MyEmptyObject();
ObjectMapper om = new ObjectMapper();
om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
String s = om.writeValueAsString(myObject);
System.out.println(s);
{}

将空字符串反序列化为 null POJO

默认情况下,空字符串不能反序列化为 null 对象,会抛异常:

String s = "{\"myObjKey\":\"\"}";
System.out.println("input:\n" + s);
ObjectMapper om = new ObjectMapper();
Map<String, MyObject> myObject = om.readValue(s, new TypeReference<Map<String, MyObject>>() { });
System.out.println(myObject);
input:
{"myObjKey":""}
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot coerce empty String ("") to `org.example.c2.MyObject` value (but could if coercion was enabled using `CoercionConfig`)at [Source: (String)"{"myObjKey":""}"; line: 1, column: 13] (through reference chain: java.util.LinkedHashMap["myObjKey"])at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)at com.fasterxml.jackson.databind.DeserializationContext.reportBadCoercion(DeserializationContext.java:1666)at com.fasterxml.jackson.databind.deser.std.StdDeserializer._checkCoercionFail(StdDeserializer.java:1432)at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromEmptyString(StdDeserializer.java:325)at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:270)at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1495)at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:207)at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:197)at com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:609)at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:437)at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:32)at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3548)at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3531)at org.example.c2.EnableEmptyStringAsNullPojo.defaultOutput(EnableEmptyStringAsNullPojo.java:25)at org.example.c2.EnableEmptyStringAsNullPojo.main(EnableEmptyStringAsNullPojo.java:17)Process finished with exit code 1

启用 DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,此设置只能用于 POJO 或一些结构化的值(比如 java.util.Mapsjava.util.Collection),但不能用于标量值(scalar values ,比如 boolean 和 number),是否可以强制使用它们取决于 MapperFeature.ALLOW_COERCION_OF_SCALARS

String s = "{\"myObjKey\":\"\"}";
System.out.println("input:\n" + s);
ObjectMapper om = new ObjectMapper();
om.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
Map<String, MyObject> myObject = om.readValue(s, new TypeReference<Map<String, MyObject>>() { });
System.out.println(myObject);
input:
{"myObjKey":""}
{myObjKey=null}

空字符串与 Java simple objects

Java simple objects 不受 DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 的控制。

BigDecimal

String s = "{\"myObjKey\":\"\"}";
System.out.println("input:\n " + s);
ObjectMapper om = new ObjectMapper();
Map<String, BigDecimal> myObject = om.readValue(s,
new TypeReference<Map<String, BigDecimal>>() { });
System.out.println(myObject);
input:{"myObjKey":""}
{myObjKey=null}

String

String s = "{\"myObjKey\":\"\"}";
System.out.println("input:\n " + s);ObjectMapper om = new ObjectMapper();
Map<String, String> myObject = om.readValue(s,
new TypeReference<Map<String, String>>() { });
System.out.println(myObject);
input:{"myObjKey":""}
{myObjKey=}

序列化时的时间格式化

默认情况下,时间会以时间戳的形式序列化:

Date date = new Date();
ObjectMapper om = new ObjectMapper();
String s = om.writeValueAsString(Map.of("myDate", date));
System.out.println(s);
{"myDate":1618323884853}

禁用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS

Date date = new Date();
ObjectMapper om = new ObjectMapper();
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String s = om.writeValueAsString(Map.of("myDate", date));
System.out.println(s);
{"myDate":"2021-04-13T14:24:45.061+00:00"}

原文链接

Jackson JSON - Jackson Commonly used Configuration Examples

Jackson常用配置示例相关推荐

  1. 【收藏】华为5700系列交换机常用配置示例

    欢迎关注微信公众号[厦门微思网络].www.xmws.cn专业IT认证培训19周年 主要课程:思科.华为.红帽.ORACLE.VMware.CISP.PMP等认证培训及考证 1 允许telnet(远程 ...

  2. springboot改文件头_SpringBoot配置文件常用配置示例

    SpringBoot配置文件 flyway.baseline-description 执行基线时标记已有Schema的描述. flyway.baseline-on-migrate 在没有元数据表的情况 ...

  3. ss-panel config.php,sspanelv3魔改版邮件设置指南及常用配置(示例代码)

    要进行SSpanel v3魔改版邮件设置,需要在设置文件(位于config/.config.php下)中修改两处内容: 1.设置发送邮件的方式 $System_Config['enable_email ...

  4. DELL 6248交换机常用配置示例

    将 running-config 文件保存为 startup-config 文件.这可确保刚刚完成的配置在交换机重新引导后保持不变. console(config)#exit console#copy ...

  5. Spring Boot 2.0 常用配置描述(官网翻译)

    常用配置描述 我们可以在application.properties文件中,application.yml文件中或命令行开关中指定各种属性. 本附录提供了常用Spring Boot属性的列表以及对使用 ...

  6. Spring Boot 实践折腾记(四):配置即使用,常用配置

    生活不可能像你想象的那么好,但也不会像你想象的那么糟.我觉得人的脆弱和坚强都超乎自己的想象.有时,可能脆弱得一句话就泪流满面:有时,也发现自己咬着牙走了很长的路.--源自 莫泊桑 开始前- 本章内容主 ...

  7. LVS DR模型配置示例

    要让路由知道哪台主机是Director,进行选择: 1.VIP:MAC(Director VIP) -- MAC绑定,但未必可行,例如路由是运营商的. 2.arptables 3.kernel par ...

  8. Spring DataSource JNDI - Tomcat JNDI 配置示例

    Spring DataSource JNDI 的 Tomcat配置示例 欢迎使用Spring DataSource JNDI Tomcat示例教程.之前我们看到了如何使用Spring JDBC集成实现 ...

  9. android http常用配置,Android中Retrofit+OkHttp进行HTTP网络编程的使用指南

    Retrofit介绍:Retrofit(GitHub主页https://github.com/square/okhttp)和OkHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库 ...

最新文章

  1. module 'tensorflow' has no attribute 'Session'
  2. 【错误记录】SeeMusic 一直卡在主界面无法使用 ( 删除 C:\Users\用户名称\AppData\LocalLow\Visual Music Design 应用信息 )
  3. SAP UI5 Input字段live change事件的一个例子
  4. 计算机服务管理器延迟启动项,开机延时启动程序
  5. 在Windows Live Writer中插入C# code
  6. linux idea 快捷键,Linux 下 IDEA 的 Ctrl+Alt+S
  7. 指针函数的一个范例,在单片机上运用它能让您的程序结构更明朗清晰,层次感强...
  8. 【渝粤教育】21秋期末考试物权法10774k1
  9. C#中奇怪的Queue T 行为!
  10. 报错Failed to load config “prettier“ to extend from.?两步解决方案
  11. 步进电机扭矩计算公式
  12. Python爬虫爬取Google图片 -续- :使用Selenium进行网页操作
  13. BZOJ 1050: [HAOI2006]旅行comf
  14. 关于const A* f(const A* pSrc,A* const pDst,int v=2,...) const throw();
  15. gamemaker学习笔记:截屏
  16. 华为手机自带浏览器不支持 ES6 语法
  17. [博弈论] Nim游戏及SG函数(经典+台阶+集合+拆分)
  18. Solidworks异型孔打孔失败原因分析
  19. 【实战】聊聊幂等设计
  20. 利用python抓取网页各种类型内容(静态、动态)

热门文章

  1. C语言期末程序设计(高铁客运订票系统)
  2. Linux 硬盘与硬件管理
  3. Pytorch 中的 torch.optim.swa_utils.AverageModel() 及其原理总结
  4. color code
  5. 白杨SEO:腾讯将全资收购搜狗,与SEO从业者有什么关系?
  6. 程序员第一次接私活?记住这三点让你事半功倍
  7. SBUS如何连接4G,如何通过数传DTU传输,实现远程控制
  8. 安卓手机很快也要普及3D Touch了
  9. base.apk软件下载免费_PS软件各版本免费下载地址
  10. 外包干了2年,彻底废了...