spring学习笔记---Jackson的使用和定制
前言:
JAVA总是把实体对象(数据库/Nosql等)转换为POJO对象再处理, 虽然有各类框架予以强力支持. 但实体对象和POJO, 由于"饮食习惯", "民族特色", "地域区别"等等差异, 需要有些定制需求, 使得能够完美的映射. 这个性化定制需求, 包括名称/时间格式/字段过滤等等约定.
springmvc的学习笔记系列:
• idea创建springmvc项目
• 面向移动端支持REST API
本文讲讲述如何把pojo对象转化为约定好的json数据格式. 权当笔记.
疑问篇:
springmvc在使用注解@ResponseBody返回一个POJO对象时, 其内部会借助Jackson来完成POJO转化为JSON的工作.
比如对于如下的POJO类:
public class Message {
private String userId; // 用户id
private String message; // 消息实体
private Date timestamp; // 时间信息, yyyy-MM-dd HH:mm:ss
private String extra; // 额外附带信息
}
其最终讲转换为如下的json格式:

如果开发者需要如下需求:
1). json实体的key命名规则, 全小写化, 不同单词以"_"字符连接.
2). 返回时间字段, 需满足"yyyy-MM-dd HH:mm:ss"格式
3). 省略掉extra字段
由此可见我们的最终目标是:
{"user_id":"1001","message":"message","timestamp":"2015-08-31 12:16:30"}
解决篇:
• 重命名
jackson对重命名的处理, 引入注解JsonProperty来实现. 其对单个属性配置有效.
@JsonProperty(value="user_id")
private String userId; // 用户id
注: value属性设置为用户想要的命名即可.
当然还有另一种方式注解方式, 是JsonNaming, 其修饰于POJO类上. 用于对所有属性, 进行统一的命名转换.
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class Message {
...
}
注: PropertyNamingStrategy就非常漂亮地把所有的类属性名称都转换为小写, 同时单词(驼峰命令法)之间使用'_'字符来分割.
自定义的Strategy类, 需要实现如下抽象类:
public abstract class PropertyNamingStrategy implements Serializable {
public abstract static class PropertyNamingStrategyBase extends PropertyNamingStrategy {
public abstract String translate(String var1);
}
}
• 字段可见性
过滤某些字段属性, jackson引入了注解JsonIgnore. 其对单个属性生效.
@JsonIgnore
private String extra; // 额外附带信息
还有另外一种方式, 是采用JsonIgnoreProperties, 其修饰POJO类, 指定一组需要忽略的字段.
// *) 字典{}内是property name列表
@JsonIgnoreProperties({"extra", "extra1", "extra2"})
public class Message {
...
}
• 自定义序列化/反序列化
jackson采用@JsonSerialize和@JsonDeserialize来实现自定义序列化/反序列化的实现. 如之前的时间字段作为例子.
定义时间序列化的实现类.
public class Message {
@JsonSerialize(using=DemoDateSerializer.class)
@JsonDeserialize(using=DemoDateDeserializer.class)
private Date timestamp; // 时间信息, yyyy-MM-dd HH:mm:ss
}
// *) JSON的序列化类
class DemoDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
jgen.writeString(dateFormat.format(value));
}
}
// *) JSON的反序列化类
class DemoDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jp, DeserializationContext dctx) throws IOException, JsonProcessingException {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return dateFormat.parse(jp.getValueAsString());
} catch (ParseException e) {
e.printStackTrace();
} finally {
}
return null;
}
}
除了常规的时间格式转换, 还能正则提取等功能. 序列化和反序列化的自定义, 使得Jackson更加的强大. 犹如hive中的UDF函数.
实验效果:
最终的定义的类修改如下:
public class Message {
@JsonProperty(value="user_id")
private String userId; // 用户id
private String message; // 消息实体
@JsonSerialize(using=DemoDateSerializer.class)
@JsonDeserialize(using=DemoDateDeserializer.class)
private Date timestamp; // 时间信息, yyyy-MM-dd HH:mm:ss
@JsonIgnore
private String extra; // 额外附带信息
}
最终的效果如图所示:

与最初期望的效果保持一致, 值得小小庆祝一下.
总结:
jackson还有很多高阶的用法, 比如破除循环引用的处理机制, 多类别的处理等等. 这边暂时忽略, 本文参考了博文"jackson annotations注解详解" , 深表敬意和感谢.
写在最后:
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

公众号&游戏站点:
个人微信公众号: 木目的H5游戏世界

spring学习笔记---Jackson的使用和定制的更多相关文章
- 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://w ...
- spring学习笔记(七)HttpMessageConverter
spring学习笔记(七)HttpMessageConverter 1. HttpMessageConverter的加载 2. 从StringMessageConverter探究消息转换器的原理 1. ...
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- Spring学习笔记2——表单数据验证、文件上传
在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...
- 不错的Spring学习笔记(转)
Spring学习笔记(1)----简单的实例 --------------------------------- 首先需要准备Spring包,可从官方网站上下载. 下载解压后,必须的两个包是s ...
- 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面
作者:ssslinppp 异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...
随机推荐
- Apache启用性能优化——启用Gzip,JS压缩
#Add deflate module for enable GZIP function LoadModule deflate_module modules/mod_deflate.so #A ...
- 一步步学习JSON
什么是Json json是JavaScript Object Notation(javascript对象表示法)的缩写,是一种轻量的数据格式,是基于javascript的一个子集.与XML一样,jso ...
- win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面
错误一: HTTP Error 500.19 - Internal Server Error配置错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的 (ov ...
- iOS开发之单例设计模式(完整正确版本)
单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...
- SyntaxError: missing ; before statement 错误的解决
今天jsp页面中报错:SyntaxError: missing ; before statement 简单的理解是语法错误,F12调试之后发现原来是我定义的一个js中的全局变量的问题. <scr ...
- linux添加动态库搜索路径
在有时运行程序出现动态库找不着的问题,而明明装了的.这时候可能是没有将相应的路径添加到系统中去. 具体说:cd /etc/ld.so.conf.d/ 可以发现里面有一堆*.conf的文件 我们要做的就 ...
- pyplot基本绘制(二)
本节主要解决在一个figure中放置多福图,以及图中一些注释文字的添加等问题. 先看一个效果图: 下面是实现代码: __author__ = 'hust' import numpy as np imp ...
- php大力力 [015节]兄弟连高洛峰php教程(土豆网栏目地址)
兄弟连高洛峰php教程 兄弟连高洛峰php教程(土豆网栏目地址) [2014]兄弟连高洛峰 PHP教程1.1.1 新版视频形式介绍 [2014]兄弟连高洛峰 PHP教程1.1.2 BS结构软件类型介绍 ...
- bootstrap菜单完美解决---原创
由于bootstrap的各方优点,偶的“点金项目细化分包管理平台”决定采用它.但在使用中遇到了一些问题,比如菜单的问题,这个菜单是用的一个JQuery的一个效果,点击后,所点击的链接处的class要加 ...
- 【LeetCode】Rotate Array
Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = ...