[英]Invalid json representation of 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());
}
output:
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}
我的问题:
那么我做错了什么? 这是库中的错误吗? 如果是这样,我应该使用什么库来完成相同的转换?
谢谢
Joda Time 确实是通往 go 的方式。 但是,如果您因任何原因被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
object 序列化为的方式。 就我而言,我对 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;
}
}
其实这种行为完全是意料之中的,信不信由你。
您正在使用 class java.util.Date
。 这个 class 主要有一堆不推荐使用的方法。 请参阅此处的文档:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
现在您的 JSON 序列化器将在您的 Java2666CFDE63931BDC49. 看看java.util.Date
class 中的吸气剂。 大多数已被弃用,您可以看到原因。 年份是相对于 1900 年的! 时区偏移以分钟为单位倒退。
要使您的应用程序按您期望的方式工作,请查看Date
的弃用警告,它告诉您使用GregorianCalendar
。 但是,我建议使用JodaTime 。 有点学习曲线,但这是非常值得的。
在这里查看 JSONObject 的来源可能会有所帮助
基本上,它将您传入的日期 object 视为 Java Bean。 因此,它通过反射进行迭代,您的日期 object 中的所有“get*”方法,这就是您在 JSONObject 中看到的内容。
所有java.util.Date对象的 get 方法都已弃用,您会看到奇怪的现象,例如年份是 111 而不是 2011。
如果您想通过 JSON 传递日期对象,您可以考虑将它们作为以特定方式格式化的字符串对象或使用日历传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.