簡體   English   中英

日期的無效 json 表示

[英]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}

我的問題:

  • 為什么年份=111。 除非我錯過了什么,否則我們仍處於 2011 年!
  • 我在美國 ETD,所以偏移量是 -4 小時,而不是 +240,即使以分鍾表示,關於偏移量的符號仍然是錯誤的。

那么我做錯了什么? 這是庫中的錯誤嗎? 如果是這樣,我應該使用什么庫來完成相同的轉換?

謝謝

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM