【问题标题】:Android Java - Serialize json date from GSONAndroid Java - 从 GSON 序列化 json 日期
【发布时间】:2016-12-09 11:11:18
【问题描述】:

我在序列化具有日期的 json 时遇到问题。

我查看了其他几个问题,但它们似乎没有帮助。

这是代码示例

String jsonString = { Date=2016-12-09T11:58:31 } Gson myGson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); MyClass myClass = myGson.fromJson(jsonString, MyClass.class);

我得到以下堆栈跟踪

Process: com.apacheapps.prang, PID: 22543
                                               com.google.gson.JsonSyntaxException: 2016-12-09T11
                                                   at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:107)
                                                   at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:82)
                                                   at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:35)
                                                   at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
                                                   at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
                                                   at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
                                                   at com.google.gson.Gson.fromJson(Gson.java:803)
                                                   at com.google.gson.Gson.fromJson(Gson.java:768)
                                                   at com.google.gson.Gson.fromJson(Gson.java:717)
                                                   at com.google.gson.Gson.fromJson(Gson.java:689)
                                                   at                                   at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                   at android.os.Looper.loop(Looper.java:158)
                                                   at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                Caused by: java.text.ParseException: Unparseable date: "2016-12-09T11" (at offset 13)
                                                   at java.text.DateFormat.parse(DateFormat.java:579)
                                                   at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:105)
                                                   at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:82) 
                                                   at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:35) 
                                                   at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58) 
                                                   at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
                                                   at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
                                                   at com.google.gson.Gson.fromJson(Gson.java:803) 
                                                   at com.google.gson.Gson.fromJson(Gson.java:768) 
                                                   at com.google.gson.Gson.fromJson(Gson.java:717) 
                                                   at com.google.gson.Gson.fromJson(Gson.java:689) 
                                                   at                                            at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
                                                   at android.os.Handler.handleCallback(Handler.java:739) 
                                                   at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                   at android.os.Looper.loop(Looper.java:158) 
                                                   at android.app.ActivityThread.main(ActivityThread.java:7229) 
                                                   at java.lang.reflect.Method.invoke(Native Method) 
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

java.text 错误是 Unparseable date - “2016-12-09T11”(偏移量 13),这让我认为日期在 HH:mm 之间的冒号处被截断。

我在不同的活动中使用相同的类多次执行完全相同的方法,并且效果很好。这完全让我感到困惑。

如果有任何帮助,我将不胜感激。

谢谢

编辑

正如 ΦXocę 和 Monish 所指出的,json 使用 equals 而不是 key-val 表示法。

这是导致问题的原因。

为了简洁起见,我最初没有解释完整的过程。这就是它的外观。

来自 api 的响应如下所示

 {"Status":true,"RecordsAffected":1,"Message":null,"OperationId":null,"Result":{"ID":2177,"Date":"2016-12-09T12:33:45"},"ErrorCode":0,"ExceptionMessage":null,"ExceptionStackTrace":null,"ExceptionInnerMessage":null,"ExceptionInnerStackTrace":null}

这被序列化为一个 JsonWrapper 类

public class JsonWrapper{


public Object Result;
boolean Status;

public String getDisplayName() {
    return Result.toString();
}

}

getDisplayName 返回以下内容

{ID=2177.0, Date=2016-12-09T12:33:45}

然后我继续将其序列化为必要的类。

这通常会序列化为标准的 key-val 表示法。

【问题讨论】:

  • 这是 JsonString 的所有内容吗:{ Date=2016-12-09T11:58:31 } ???
  • BTW Json 是 Key:Val 而不是 Key=Val
  • 你的问题不清楚
  • 尝试使用 String jsonString = { 2016-12-09T11:58:31 }
  • 顺便说一句,没有“json 日期”之类的东西。 JSON 有 very few data typesno 支持日期时间类型。您的字符串格式恰好符​​合标准ISO 8601 格式。 java.time 类中默认使用标准格式,取代了麻烦的遗留日期时间类。

标签: java android gson android-volley date-format


【解决方案1】:

它工作得很好。您的 JSON 无效。

只要改变这一行

String jsonString = { Date=2016-12-09T11:58:31 }

String jsonString = "{\"Date\":\"2016-12-09T11:58:31\"}";


工作代码

String jsonString = "{\"Date\":\"2016-12-09T11:58:31\"}";
Gson myGson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();
MyClass myClass = myGson.fromJson(jsonString, MyClass.class);
Log.d(getClass().getSimpleName(),"GSON deserialized date : " + myClass.getDate().toString());

模型类:

public class MyClass {

    @SerializedName("Date")
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

输出: GSON 反序列化日期:Fri Dec 09 11:58:31 GMT+05:30 2016

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多