Gson无法解析日期

10
在我的应用程序中,一些用户会抛出致命异常:com.google.gson.JsonSyntaxException。我使用Gson将数据写入并读取到磁盘LRU缓存中。我了解到当我从缓存中读取数据时会发生此异常。
下面是我创建json实例的代码:
Gson gson = new Gson();

这个异常在Android 5,6,7,8上发生。这是从Crashlytics中的统计数据得出的。

以下是来自Crashlytics的异常堆栈跟踪:

Fatal Exception: com.google.gson.JsonSyntaxException: Nov 5, 2019 20:18:24
       at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:87)
       at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:75)
       at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:46)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
       at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
       at com.google.gson.Gson.fromJson(Gson.java:927)
       at com.google.gson.Gson.fromJson(Gson.java:892)
       at com.google.gson.Gson.fromJson(Gson.java:841)
       at com.google.gson.Gson.fromJson(Gson.java:813)
       at com.example.data.repository.MbCacheImpl.getDashboard(MbCacheImpl.java:44)
       at com.example.data.repository.DataRepository.getDashboard(DataRepository.java:64)
       at com.example.ui.main.main.TabMainViewModel.loadDashboard(TabMainViewModel.java:289)
       at com.example.ui.main.main.TabMainViewModel.loadData(TabMainViewModel.java:260)
       at com.example.ui.base.BaseDataViewModel$onAttach$1.onAvailable(BaseDataViewModel.java:124)
       at android.net.ConnectivityManager$CallbackHandler.handleMessage(ConnectivityManager.java:3108)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.os.HandlerThread.run(HandlerThread.java:61)

Caused by java.text.ParseException: Failed to parse date ["Nov 5, 2019
                20:18:24"]: Invalid number: Nov 
                       at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:274)
       at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:85)
       at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:75)
       at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:46)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
       at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
       at com.google.gson.Gson.fromJson(Gson.java:927)
       at com.google.gson.Gson.fromJson(Gson.java:892)
       at com.google.gson.Gson.fromJson(Gson.java:841)
       at com.google.gson.Gson.fromJson(Gson.java:813)
       at com.example.data.repository.MbCacheImpl.getDashboard(MbCacheImpl.java:44)
       at com.example.data.repository.DataRepository.getDashboard(DataRepository.java:64)
       at com.example.ui.main.main.TabMainViewModel.loadDashboard(TabMainViewModel.java:289)
       at com.example.ui.main.main.TabMainViewModel.loadData(TabMainViewModel.java:260)
       at com.example.ui.base.BaseDataViewModel$onAttach$1.onAvailable(BaseDataViewModel.java:124)
       at android.net.ConnectivityManager$CallbackHandler.handleMessage(ConnectivityManager.java:3108)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.os.HandlerThread.run(HandlerThread.java:61)

Caused by java.lang.NumberFormatException: Invalid number: Nov
                       at com.google.gson.internal.bind.util.ISO8601Utils.parseInt(ISO8601Utils.java:311)
       at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:129)
       at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:85)
       at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:75)
       at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:46)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
       at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
       at com.google.gson.Gson.fromJson(Gson.java:927)
       at com.google.gson.Gson.fromJson(Gson.java:892)
       at com.google.gson.Gson.fromJson(Gson.java:841)
       at com.google.gson.Gson.fromJson(Gson.java:813)
       at com.example.data.repository.MbCacheImpl.getDashboard(MbCacheImpl.java:44)
       at com.example.data.repository.DataRepository.getDashboard(DataRepository.java:64)
       at com.example.ui.main.main.TabMainViewModel.loadDashboard(TabMainViewModel.java:289)
       at com.example.ui.main.main.TabMainViewModel.loadData(TabMainViewModel.java:260)
       at com.example.ui.base.BaseDataViewModel$onAttach$1.onAvailable(BaseDataViewModel.java:124)
       at android.net.ConnectivityManager$CallbackHandler.handleMessage(ConnectivityManager.java:3108)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.os.HandlerThread.run(HandlerThread.java:61)
2个回答

15

由java.text.ParseException引起: 无法解析日期["Nov 5, 2019 20:18:24"]: Invalid number: Nov

尝试设置日期格式以进行解析。

Gson gson = new GsonBuilder().setDateFormat("MMM dd, yyyy HH:mm:ss").create();


1
应该不是 ("MMM dd, yyyy HH:mm:ss") 吗? - Hilal
@Hilal,重要的不是它本身,而是需要使用相同的日期配置进行序列化和反序列化。 - Ben-J
谢谢!以下代码是正确的: Gson gson = new GsonBuilder().setDateFormat("yyyy/MM/dd HH:mm:ss").create(); - ps6duel

0
我刚刚添加了gson自定义日期序列化器和反序列化器,我使用了@P.Juni的答案,它对我也有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接