Java Date转Json报错解决方案
报错信息为:
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)
... 55 more
Caused by: java.lang.IllegalArgumentException
at java.sql.Date.getHours(Date.java:187)
... 65 more
原因:
java.sql.util.Date 类的 getHours 方法已经被弃用,但是 net.sf.json.JSONObject.fromObject(javaObject) 进行 json 序列化的时候仍然调用了这个方法。
这篇博客中描述的很详细:https://segmentfault.com/a/1190000016937108
结局方法:
json-lib 有一个配置类 JsonConfig,通过 JsonConfig 可以注册一个字段处理器,通过实现 JsonValueProcessor 接口,将 Date 格式化后使用。
加入依赖:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
实现接口:
@Test
public void testJson(){
Map<String, Object> mp = new ModelMap();
mp.put("server",server.getAll());
<span class="hljs-type">JsonConfig</span> <span class="hljs-variable">config</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">JsonConfig</span>();
config.registerJsonValueProcessor(java.sql.Date.class, <span class="hljs-keyword">new</span> <span class="hljs-title class_">JsonValueProcessor</span>() {
<span class="hljs-keyword">private</span> <span class="hljs-type">SimpleDateFormat</span> <span class="hljs-variable">sd</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">SimpleDateFormat</span>(<span class="hljs-string">"yyyy-MM-dd"</span>);
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> Object <span class="hljs-title function_">processArrayValue</span><span class="hljs-params">(Object arg0, JsonConfig arg1)</span> {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> Object <span class="hljs-title function_">processObjectValue</span><span class="hljs-params">(String arg0, Object arg1, JsonConfig arg2)</span> {
<span class="hljs-type">return</span> <span class="hljs-variable">arg1</span> <span class="hljs-operator">=</span>= <span class="hljs-literal">null</span> ? <span class="hljs-string">""</span> : sd.format(arg1);
}
});
<span class="hljs-type">JSONObject</span> <span class="hljs-variable">jsonObject</span> <span class="hljs-operator">=</span> JSONObject.fromObject(mp);
<span class="hljs-type">String</span> <span class="hljs-variable">msg</span> <span class="hljs-operator">=</span> jsonObject.toString();
System.out.println(msg);
}