如何使用GSON用空格反序列化日期?

时间:2015-06-25 17:38:56

标签: android gson

我有一个JSON日期,我试图反序列化:

{
   "created_at":"2015-05-26 10:14:32"
}

但是,该空间似乎导致GSON出现问题,并引发以下错误:

com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:第1行第160行路径的未终止对象$ .created_at

com.google.gson.JsonSyntaxException:2015-05-26

引起:java.text.ParseException:无法解析的日期:“2015-05-26”(偏移10处)

这是我的GSON配置:

Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss")
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getDeclaringClass().equals(RealmObject.class);
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            })
            .create();

我的模特:

public class MyModel extends ReamlObject {

    @SerializedName("created_at")
    private Date createdAt = new Date(System.currentTimeMillis());
}

最后

gson.fromJson(json, MyModel.class);

是否有人有任何解决方案允许日期范围内的空间?我已经尝试过自定义日期反序列化器,但这也没有任何区别。

3 个答案:

答案 0 :(得分:1)

从这里: malformedjsonexception 我相信你的JSON中有一个虚假的“空间”,GSON认为它是无效的:

GSON在非空白对象结束后有额外字符时抛出该特定错误,并且它非常狭窄地定义空白(如JSON规范所做的那样) - 只有\ t,\ n,\ r \ n和空格算作空白。特别要注意,尾随NUL(\ 0)字符不算作空格,会导致此错误。

此外,从Gson用户指南中,我们读到:

...处理库类(DateTime等)时经常会出现这种情况。 Gson允许您注册自己的自定义序列化程序和反序列化程序。这是通过定义两部分来完成的:...

意思是你必须this

答案 1 :(得分:1)

It may be your text input,

check this unit test is working just right:

public class ParesDateTest{
    @Test
    public void test(){
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .setExclusionStrategies(new ExclusionStrategy() {
                    @Override
                    public boolean shouldSkipField(FieldAttributes f) {
                        return false;
                    }

                    @Override
                    public boolean shouldSkipClass(Class<?> clazz) {
                        return false;
                    }
                })
                .create();

        MyModel o = gson.fromJson("{\n" +
                "   \"created_at\":\"2015-03-26 10:14:32\"\n" +
                "}",MyModel.class);
        Assert.assertNotNull(o);


    }

    public class MyModel  {

        @SerializedName("created_at")
        private Date createdAt = new Date(System.currentTimeMillis());
    }
}  

答案 2 :(得分:0)

尝试使用此格式。随着&#39; T&#39;替换空间。

  Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();