简体   繁体   English

Android Java-从GSON序列化json日期

[英]Android Java - Serialize json date from GSON

I am having trouble in serializing a json that has a date. 我在序列化具有日期的json时遇到麻烦。

I have looked over a few other questions and they don't seem to help. 我查看了其他一些问题,它们似乎无济于事。

This is an sample of the code 这是代码示例

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);

I get the following stack trace 我得到以下堆栈跟踪

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) 

The java.text error is Unparseable date - "2016-12-09T11" (at offset 13) which makes me think that the date is being cut off at the colon between HH:mm. java.text错误是不可解析的日期-“ 2016-12-09T11”(在偏移量13处),这使我认为该日期在HH:mm之间的冒号处被截断。

I have done the exact same method on a number of times in different activities using the same class and it works fine. 我使用相同的类在不同的活动中多次执行完全相同的方法,并且效果很好。 This is completely baffling me. 这完全让我感到困惑。

I would appreciate any help. 我将不胜感激任何帮助。

Thanks 谢谢

Edit 编辑

As pointed out by ΦXocę and Monish, by json uses equals rather than key-val notation. 正如ΦXocę和Monish所指出的那样,json通过使用equals而不是key-val表示法。

This is causing the issue. 这是引起问题的原因。

For brevity I didn't initially explain the complete process. 为简洁起见,我最初没有解释完整的过程。 This is how it looks. 这就是它的样子。

The response from the api looks like this 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}

This is serialized into a JsonWrapper class 这被序列化为JsonWrapper类

public class JsonWrapper{


public Object Result;
boolean Status;

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

} }

getDisplayName returns the below getDisplayName返回以下内容

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

I then go on to serialize this into the necessary class. 然后,我继续将其序列化为必要的类。

This normally serialises to the standard key-val notation. 通常,这会序列化为标准键值符号。

It is working perfectly fine. 运行正常。 Your JSON is not valid. 您的JSON无效。

Just change this line 只需更改此行

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

to

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


Working code 工作代码

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());

Model class : 型号类别:

public class MyClass {

    @SerializedName("Date")
    private Date date;

    public Date getDate() {
        return date;
    }

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

Output : GSON deserialized date : Fri Dec 09 11:58:31 GMT+05:30 2016 输出: GSON反序列化日期:2016年12月9日星期五11:58:31 GMT + 05:30

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM