当前位置: 移动技术网 > IT编程>开发语言>Java > 解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

2019年07月22日  | 移动技术网IT编程  | 我要评论
有时在spring mvc中返回json格式的response的时候会使用@responsebody注解,不过在处理java8中时间的时候会很麻烦,一般我们使用的httpm

有时在spring mvc中返回json格式的response的时候会使用@responsebody注解,不过在处理java8中时间的时候会很麻烦,一般我们使用的httpmessageconverter是mappingjackson2httpmessageconverter,它默认返回的时间格式是这种:

"startdate" : {
  "year" : 2010,
  "month" : "january",
  "dayofmonth" : 1,
  "dayofweek" : "friday",
  "dayofyear" : 1,
  "monthvalue" : 1,
  "hour" : 2,
  "minute" : 2,
  "second" : 0,
  "nano" : 0,
  "chronology" : {
   "id" : "iso",
   "calendartype" : "iso8601"
  }
 }

但是我们不会返回这种给前端使用,针对localdate想要返回的格式是2016-11-26,而localdatetime想要返回的格式是2016-11-26 21:04:34这样的数据。通过项目研究并查阅相关资料,这里介绍下个人研究中实现的两种方式。

解决方法一:

若是maven项目,在pom中引入下面的jar包:

<dependency>
   <groupid>com.fasterxml.jackson.datatype</groupid>
   <artifactid>jackson-datatype-jsr310</artifactid>
   <version>2.8.5</version>
 </dependency>

然后在你想要json化的pojo字段的get函数上加上一个@jsonserializer注解,如下

import com.fasterxml.jackson.annotation.jsonformat;

@jsonformat(shape = jsonformat.shape.string, pattern = "yyyy-mm-dd")
public localdatetime getbirthday() {
    return this.logintime;
  }

@jsonformat(shape = jsonformat.shape.string, pattern = "yyyy-mm-dd hh:mm:ss")
public localdatetime getlastlogintime() {
    return this.logintime;
  }

这种方式的优点是可以针对具体域类型设置不同显示方式,然而优点也是缺点,因为每个日期属性都要手动添加,实际中日期属性又是普遍必备,并且需要额外引入jsr310的jar包。

解决方法二:

继承objectmapper来实现返回json字符串。mappingjackson2httpmessageconverter主要通过objectmapper来实现返回json字符串。这里我们编写一个jsonutil类,获取objectmapper以针对java8中新的日期时间api,注册相应的jsonserializer<t>。

/**
 * json处理工具类
 * 
 * 
 */
@component
public class jsonutil {

  private static final objectmapper mapper;

  public objectmapper getmapper() {
    return mapper;
  }

  static {

    mapper = new objectmapper();

    simplemodule module = new simplemodule();
    module.addserializer(localdate.class, new localdateserializer());
    module.addserializer(localtime.class, new localtimeserializer());
    module.addserializer(localdatetime.class, new localdatetimeserializer());
    mapper.registermodule(module);
  }

  public static string tojson(object obj) {
    try {
      return mapper.writevalueasstring(obj);
    } catch (exception e) {
      throw new runtimeexception("转换json字符失败!");
    }
  }

  public <t> t toobject(string json, class<t> clazz) {
    try {
      return mapper.readvalue(json, clazz);
    } catch (ioexception e) {
      throw new runtimeexception("将json字符转换为对象时失败!");
    }
  }
}

class localdateserializer extends jsonserializer<localdate> {

  private static final datetimeformatter dateformatter = datetimeformatter.ofpattern("yyyy-mm-dd");

  @override
  public void serialize(localdate value, jsongenerator jgen, serializerprovider provider)
      throws ioexception, jsonprocessingexception {
    jgen.writestring(dateformatter.format(value));
  }
}

class localdatetimeserializer extends jsonserializer<localdatetime> {

  private static final datetimeformatter datetimeformatter = datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss");

  @override
  public void serialize(localdatetime value, jsongenerator jgen, serializerprovider provider)
      throws ioexception, jsonprocessingexception {
    jgen.writestring(datetimeformatter.format(value));
  }

}

class localtimeserializer extends jsonserializer<localtime> {

  private static final datetimeformatter timeformatter = datetimeformatter.ofpattern("hh:mm:ss");

  @override
  public void serialize(localtime value, jsongenerator jgen, serializerprovider provider)
      throws ioexception, jsonprocessingexception {
    jgen.writestring(timeformatter.format(value));

  }

}

然后在springmvc的配置文件中,再将<mvc:annotation-driven/>改为以下配置,配置一个新的json转换器,将它的objectmapper对象设置为jsonutil中的objectmapper对象,此转换器比spring内置的json转换器优先级更高,所以与json有关的转换,spring会优先使用它。

<mvc:annotation-driven>
    <mvc:message-converters>
      <bean
        class="org.springframework.http.converter.json.mappingjackson2httpmessageconverter">
        <property name="objectmapper" value="#{jsonutil.mapper}" />
        <property name="supportedmediatypes">
          <list>
            <value>application/json;charset=utf-8</value>
          </list>
        </property>
      </bean>
    </mvc:message-converters>
  </mvc:annotation-driven>

然后java8中的几种日期和时间类型就可以正常友好的显示了。优点是全局统一管理日期和时间等类型,缺点对pojo中的某个域做特殊处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网