spring学习笔记---Jackson的使用和定制
2017-01-12 08:59
363 查看
http://www.cnblogs.com/mumuxinfei/p/4761374.html
****************************************
前言:
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格式:
{"user_id":"1001","message":"message","timestamp":"2015-08-31 12:16:30"}
如果开发者需要如下需求:
1). json实体的key命名规则, 全小写化, 不同单词以"_"字符连接.
2). 返回时间字段, 需满足"yyyy-MM-dd HH:mm:ss"格式
3). 省略掉extra字段
由此可见我们的最终目标是:
解决篇:
• 重命名
jackson对重命名的处理, 引入注解JsonProperty来实现. 其对单个属性配置有效.
注: value属性设置为用户想要的命名即可.
当然还有另一种方式注解方式, 是JsonNaming, 其修饰于POJO类上. 用于对所有属性, 进行统一的命名转换.
注: PropertyNamingStrategy就非常漂亮地把所有的类属性名称都转换为小写, 同时单词(驼峰命令法)之间使用'_'字符来分割.
自定义的Strategy类, 需要实现如下抽象类:
• 字段可见性
过滤某些字段属性, jackson引入了注解JsonIgnore. 其对单个属性生效.
还有另外一种方式, 是采用JsonIgnoreProperties, 其修饰POJO类, 指定一组需要忽略的字段.
• 自定义序列化/反序列化
jackson采用@JsonSerialize和@JsonDeserialize来实现自定义序列化/反序列化的实现. 如之前的时间字段作为例子.
定义时间序列化的实现类.
除了常规的时间格式转换, 还能正则提取等功能. 序列化和反序列化的自定义, 使得Jackson更加的强大. 犹如hive中的UDF函数.
实验效果:
最终的定义的类修改如下:
最终的效果如图所示:
与最初期望的效果保持一致, 值得小小庆祝一下.
总结:
jackson还有很多高阶的用法, 比如破除循环引用的处理机制, 多类别的处理等等. 这边暂时忽略, 本文参考了博文"jackson annotations注解详解" , 深表敬意和感谢.
[b]写在最后:
[/b]如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.
****************************************
前言:
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格式:
{"user_id":"1001","message":"message","timestamp":"2015-08-31 12:16:30"}
如果开发者需要如下需求:
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. 其对单个属性生效.
还有另外一种方式, 是采用JsonIgnoreProperties, 其修饰POJO类, 指定一组需要忽略的字段.
jackson采用@JsonSerialize和@JsonDeserialize来实现自定义序列化/反序列化的实现. 如之前的时间字段作为例子.
定义时间序列化的实现类.
实验效果:
最终的定义的类修改如下:
与最初期望的效果保持一致, 值得小小庆祝一下.
总结:
jackson还有很多高阶的用法, 比如破除循环引用的处理机制, 多类别的处理等等. 这边暂时忽略, 本文参考了博文"jackson annotations注解详解" , 深表敬意和感谢.
[b]写在最后:
[/b]如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.
相关文章推荐
- spring学习笔记---Jackson的使用和定制
- spring学习笔记---Jackson的使用和定制
- Java 学习笔记07:使用Spring的Dao连接数据库
- Spring学习笔记 使用XML配置实现Bean的auto-wiring (自动绑定)
- Spring2.5注解(标注)学习笔记(使用annotation代替XML)
- Spring学习笔记 在XML配置文件中使用properties文件的键值
- ITCAST视频-Spring学习笔记(使用构造器装配属性)
- [转]spring学习笔记:annotation的使用3
- Spring学习笔记 使用annotation配置实现Bean的auto-wiring (自动绑定)
- Spring学习笔记 使用Static Factory(静态工厂类)创建Bean
- Java 学习笔记13:Spring JSTL 核心标签库 使用
- ITCAST视频-Spring学习笔记(使用JDK中的Proxy技术实现AOP功能)
- spring学习笔记5——Spring里使用JDBC
- Spring学习笔记 关于FactoryBean接口的使用
- FastSpring学习笔记二(使用工具MyGeneration生成Model和NHibernate的代码 )
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP的细节)
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
- Spring学习笔记(15)----使用Spring注解方式管理事务
- Spring学习笔记 通过PropertyPlaceholderConfigurer来使用properties文件初始化Map类型属性
- Spring学习笔记 关于Bean定义的重用-使用abstract以及parent标签属性