日期的json表示无效

时间:2011-08-14 02:21:23

标签: java json serialization date

我的代码:

import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
...
public void testDateSerializer() {
  final Date date = new Date();
  log.info("Today's date: " + date + " and date.getTime()=" + date.getTime());
  final JSONObject jsonObjectForDate = (JSONObject) JSONSerializer.toJSON(date);
  log.info("Same date expressed in json: " + jsonObjectForDate.toString());
}

输出:

INFO - 2011-08-13 22:12:04,938 - TestJsonConversion.testDateSerializer(52) | Today's date: Sat Aug 13 22:12:04 EDT 2011 and date.getTime()=1313287924927
INFO - 2011-08-13 22:12:05,216 - TestJsonConversion.testDateSerializer(55) | Same date expressed in json: {"date":13,"day":6,"hours":22,"minutes":12,"month":7,"seconds":4,"time":1313287924927,"timezoneOffset":240,"year":111}

我的问题:

  • 为什么年= 111。我们还在2011年,除非我错过了什么!
  • 我在美国ETD,所以抵消是-4小时,而不是+240,即使以分钟表示,对于抵消的标志仍然是错误的。

那么我做错了什么?这是库中的错误吗?如果是这样,我应该使用哪个库来完成相同的转换?

谢谢

3 个答案:

答案 0 :(得分:4)

Joda Time确实是要走的路。但是,如果您因任何原因而无法使用java.util.Date,则可以通过以下方式自定义序列化:

   JsonConfig config = new JsonConfig();
   config.registerJsonValueProcessor(
        Class.forName("java.util.Date"), 
        new NiceDateJsonBeanProcessor());
   final JSONObject jsonObjectForDate = JSONSerializer.toJSON(object, jsonConfig)

NiceDateJsonBeanProcessor在哪里定义您想要的内容java.util.Date 要序列化为的对象。就我而言,我对unix时间很满意,所以:

public static class NiceDateJsonBeanProcessor implements JsonValueProcessor {
    @Override
    public Object processArrayValue(Object value, JsonConfig jsonConfig) {
        return process(value, jsonConfig);
    }
    @Override
    public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
        return process(value, jsonConfig);
    }
    private Object process(Object value, JsonConfig jsonConfig) {
        if (value instanceof java.util.Date) {
            java.util.Date d = (java.util.Date) value;
            return d.getTime();
        }
        return null;
    }
}

答案 1 :(得分:1)

实际上,无论信不信,这种行为是完全可以预料到的。

您正在使用班级java.util.Date。这个类主要有一堆不推荐使用的方法。请参阅此处的文档:

http://download.oracle.com/javase/6/docs/api/java/util/Date.html

现在,您的JSON序列化程序将从Java对象中的getter中生成JSON字符串。看看java.util.Date课程中的getters。大多数都被弃用,你可以看到原因。这一年是相对于1900年!时区偏移 以分钟为单位。

要使您的应用程序按预期方式运行,请查看Date的弃用警告,告知您使用GregorianCalendar。但是,我建议使用JodaTime。一点学习曲线,但这是值得的。

答案 2 :(得分:1)

查看JSONObject here

的来源可能会有所帮助

基本上,它将传入的Date对象视为Java Bean。因此,它遍历反射,日期对象中的所有“get *”方法,这就是您在JSONObject中看到的内容。

所有java.util.Date对象的get方法都已弃用,您会看到很奇怪,例如年份为111而不是2011年。

如果要通过JSON传递日期对象,可以考虑将它们作为以特定方式格式化的String对象传递或使用日历。