JSONValueProcessor日期转化问题

问题来源:

在使用json lib时候遇到了一个奇葩的问题,有一个请求时会报错,报的是日期转换错误。感觉这个是个坑,所以在此记录一下。

最终解决方案:由于查询返回的是List<Map>类型,指定返回结果的时候,用的是java.Util.Map。而数据库中时间的格式是date类型,在mybatis映射的时候,由于用的是map,没有指定resultMap的映射类型。结果传入的日期,使用json转化器转换的时候,传入的日期是java.sql.Date类型(但是json转换器指定的是Date类型的)。需要经过一层包装即可,或者修改注入的json转换器的日期类型为java.sql.Date类型,并对此做相应的实现。

 

两个大的作用:

①将Java对象转成json格式的字符串或反之

②将Java对象转换成xml格式的文档或反之

常见用途:数值格式化和日期格式化。

使用对象:JsonConfig,JsonValueProcessor。

maven引入:

<dependency>          
    <groupId>net.sf.json-lib</groupId>           
    <artifactId>json-lib</artifactId>        
    <version>2.4</version>           
    <classifier>jdk15</classifier>        
</dependency>

gradle引入:

compile group: 'net.sf.json-lib', name: 'json-lib', version: '2.4'

错误重现

{"time2":"2018-12-31","mp":{"num":200,"time":"2018-12-19"},"num":11,"time":"2018-12-19"}
------------------------------------
Exception in thread "main" net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
    at net.sf.json.JSONObject.defaultBeanProcessing(JSONObject.java:818)
    at net.sf.json.JSONObject._fromBean(JSONObject.java:699)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:172)
    at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:274)
    at net.sf.json.JSONObject._processValue(JSONObject.java:2655)
    at net.sf.json.JSONObject.processValue(JSONObject.java:2721)
    at net.sf.json.JSONObject.setInternal(JSONObject.java:2736)
    at net.sf.json.JSONObject.setValue(JSONObject.java:1424)
    at net.sf.json.JSONObject._fromMap(JSONObject.java:1168)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:163)
    at com.lethez.JsonLibTest.main(JsonLibTest.java:39)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2155)
    at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1323)
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:762)
    at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:837)
    at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:426)
    at net.sf.json.JSONObject.defaultBeanProcessing(JSONObject.java:749)
    ... 10 more
Caused by: java.lang.IllegalArgumentException
    at java.sql.Date.getHours(Date.java:187)
    ... 20 more

Process finished with exit code 1

 

测试代码
package com.lethez;

import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * author: lethez
 * describe:
 * date: 2018/12/19 - 9:21
 */
public class JsonLibTest {
    
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("time",new Date());
        map.put("time2",new Date(new Date().getTime()+1000000000));
        map.put("num",11);
        Map map2 = new HashMap();
        map2.put("time",new Date());
        map2.put("num",200);
        map.put("mp",map2);
        JsonConfig config = new JsonConfig();
        config.registerJsonValueProcessor(Date.class, new CustomerJsonValueProcessor("yyyy-MM-dd"));
        JSONObject jo = JSONObject.fromObject(map,config);
        System.out.println(jo);

        System.out.println("------------------------------------");
        Map map3 = new HashMap();
        //map3.put("time",new java.sql.Date(100000));
        map3.put("time",new Date((new java.sql.Date(100000)).getTime()));
        JsonConfig config2 = new JsonConfig();
        config2.registerJsonValueProcessor(Date.class, 
        new CustomerJsonValueProcessor2("yyyy-MM-dd"));
        JSONObject jo2 = JSONObject.fromObject(map3,config);
        System.out.println(jo2);

    }
    
    
      static class CustomerJsonValueProcessor implements JsonValueProcessor{
        
          private String pattern;
          
         public Object processArrayValue(Object o, JsonConfig jsonConfig) {
             return process(o);
         }

         @Override
         public Object processObjectValue(String s, Object o, JsonConfig jsonConfig) {
             return process(o);
         }
         
          public CustomerJsonValueProcessor() {
              super();
          }

          public CustomerJsonValueProcessor(String format) {
              this.pattern = format;
          }

          private  Object process(Object val){
              if(null!=val && val instanceof  Date){
                  SimpleDateFormat sdf =
        new SimpleDateFormat(this.pattern, Locale.CHINESE);
                  return sdf.format(val);
              }
                  return val==null?"":val.toString();
          }

      }

    static class CustomerJsonValueProcessor2 implements JsonValueProcessor{
        
        private String pattern ;

        public CustomerJsonValueProcessor2() {
            super();
        }

        public CustomerJsonValueProcessor2(String format) {
            this.pattern = format;
        }
        
        @Override
        public Object processArrayValue(Object o, JsonConfig jsonConfig) {
            return process(o);
        }

        @Override
        public Object processObjectValue(String s, Object o, JsonConfig jsonConfig) {
            return process(o);
        }


        private  Object process(Object val){
            if(null!=val && val instanceof  Date){
                SimpleDateFormat sdf = new SimpleDateFormat(this.pattern,Locale.CHINESE);
                return sdf.format(val);
            }
                return val==null?"":val.toString();
        }

    }
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值