如何使用 GSON 反序列化带有 space 的日期?

How to deserialise a date with a space using GSON?

我有一个 JSON 日期,我正在尝试反序列化:

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

但是,space 似乎导致 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);

有没有人有任何允许 space 日期内的解决方案?我试过自定义日期反序列化器,但也没有任何区别。

从这里开始: malformedjsonexception 我相信你的 JSON 中有一个错误的 "space",GSON 认为它无效:

GSON 在对象末尾后有非白色的额外字符时抛出该特定错误space,并且它定义白色space 非常狭窄(如 JSON spec 确实如此)——只有 \t、\n、\r 和 space 算作白色 space。特别要注意尾随的 NUL (\0) 字符不算作白色 space 并且会导致此错误。

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

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

意味着你必须做this

尝试使用这种格式。用 'T' 替换 space.

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

可能是你的文字输入,

检查此单元测试是否正常工作:

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