springmvc学习笔记---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游戏世界
  

时间: 2024-10-28 11:40:37

springmvc学习笔记---Jackson的使用和定制的相关文章

springmvc学习笔记--REST API的异常处理

前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出异常, 返回的内容是500+的错误页面, 而不是json内容, 这让移动端的调用方很难处理. 本文主要讲述对于rest api, springmvc对异常的解决处理方案. 系列整理: springmvc学习笔记系列的文章目录: • idea创建springmvc项目 • 面向移动端的REST API

springmvc学习笔记(18)-json数据交互

springmvc学习笔记(18)-json数据交互 springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 添加json转换的依赖 配置json转换器 json交互测试 输入json串输出是json串 输入keyvalue输出是json串 本文主要介绍如何在springmvc中进行json数据的交互,先是环境准备和配置,然后分别展示了"输入json串,输出是json串"和"输入key/value,输出是json串"两种情况下

springmvc学习笔记---面向移动端支持REST API

前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下springmvc对rest api的支持程度, 以及需要做的工作评估. 样例设计和准备: springmvc学习笔记系列的文章目录: • idea创建springmvc项目 REST API的设计原则遵循之前的博文来实现 • 移动互联网实战--Web Restful API设计和基础架构  初步设计一个查询系

SpringMVC学习笔记(二): 日常使用功能

前提: 1.web.xml 和spring-mvc核心配置如:SpringMVC学习笔记(一): 基础知识中注解实现. 2.类的@RequestMapping(value="/annotationController") 3.spring-mvc 推荐使用注解实现. 一.数据的接收 (一)URL参数数据的接收 1.使用 HttpServletRequest 获取参数 <span style="font-size:18px;"><span style

史上最全的SpringMVC学习笔记

SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servlet> <servlet-name>springmvc</servlet

springmvc学习笔记(8)-springmvc整合mybatis之service

springmvc学习笔记(8)-springmvc整合mybatis之service springmvc学习笔记8-springmvc整合mybatis之service 定义service接口 在spring容器配置service 事务控制 本文记录如何整合service,包括定义spring接口,在spring容器配置service以及事务控制.让spring管理service接口. 定义service接口 public interface ItemsService { //商品查询列表 L

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型參数绑定,包含数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品.批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形參,方法形參使用数组接收页面请求的多个商

springmvc学习笔记(20)-拦截器

springmvc学习笔记(20)-拦截器 springmvc学习笔记20-拦截器 拦截定义 拦截器配置 针对HandlerMapping配置 类似全局的拦截器 拦截测试 拦截器应用实现登陆认证 需求 登陆controller方法 登陆认证拦截实现 本文主要介绍springmvc中的拦截器,包括拦截器定义和的配置,然后演示了一个链式拦截的测试示例,最后通过一个登录认证的例子展示了拦截器的应用 拦截定义 定义拦截器,实现HandlerInterceptor接口.接口中提供三个方法. public

springmvc学习笔记(15)-数据回显

springmvc学习笔记(15)-数据回显 springmvc学习笔记15-数据回显 pojo数据回显方法 简单类型数据回显 本文介绍springmvc中数据回显的几种实现方法 数据回显:提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面. pojo数据回显方法 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写) 使用@ModelAttribute