【发布时间】: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 types,no 支持日期时间类型。您的字符串格式恰好符合标准ISO 8601 格式。 java.time 类中默认使用标准格式,取代了麻烦的遗留日期时间类。
标签: java android gson android-volley date-format