Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日期的json表示无效_Java_Json_Serialization_Date - Fatal编程技术网

Java 日期的json表示无效

Java 日期的json表示无效,java,json,serialization,date,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 jsonObjec

我的代码:

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,即使以分钟表示,关于偏移量的符号仍然是错误的
那么我做错了什么?这是图书馆里的错误吗?如果是,我应该使用什么库来完成相同的转换


谢谢

事实上,这种行为完全是意料之中的,信不信由你

您正在使用类
java.util.Date
。这个类有很多不推荐使用的方法。请参阅此处的文档:

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


要使应用程序按预期方式工作,请查看
Date
的弃用警告,它告诉您使用
gregoriacalendar
。但是,我建议使用。一点学习曲线,但这是非常值得的。

看看JSONObject的源代码可能会有所帮助

基本上,它将传入的日期对象视为Javabean。因此,它通过反射、日期对象中的所有“get*”方法进行迭代,这就是您在JSONObject中看到的

所有对象的get方法都被弃用了,您会看到一些奇怪之处,比如今年是111年而不是2011年


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

< PJODA时间确实是该走的路。但是,如果出于任何原因而坚持使用
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;
    }
}

非常感谢。我确实开始使用字符串对象来使用我想要的格式,并且去掉了大多数getter。“Joda Time确实是一种方式。”我大体上同意这一点,但这会有什么不同呢?它对JSON序列化有帮助吗?