当前位置: 首页 > 知识库问答 >
问题:

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

施刚毅
2023-03-14

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

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

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

通用域名格式。谷歌。格森。JsonSyntaxException:com.google.格森。流动MalformedJsonException:第1行第160列的未终止对象路径$。已在创建\u

通用域名格式。谷歌。格森。JsonSyntaxException:2015-05-26

原因:java。文本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个答案

呼延河
2023-03-14

尝试使用此格式。用“T”替换空格。

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

从这里开始:malformedjsonexception我相信您的JSON中有一个错误的“空格”,GSON认为该空格无效:

当对象结尾后有非空白的额外字符时,GSON会抛出该错误,并且它定义的空白非常狭窄(就像JSON规范所做的那样)-仅\t、\n、\r,并且空格计为空白。请特别注意,尾随的NUL(\0)字符不算作空白,这将导致此错误。

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

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

意思是你必须这样做

谯德元
2023-03-14

它可能是您的文本输入,

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

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());
    }
}  
 类似资料:
  • 问题内容: 我使用了很多不可变的集合,并且很好奇如何使用Gson反序列化它们。由于没有人回答,而且我自己找到了解决方案,因此我正在简化问题并提出自己的答案。 我有两个问题: 如何为所有人编写一个作品? 如何全部注册? 问题答案: 更新:有https://github.com/acebaggins/gson- serializers ,其中涵盖了许多番石榴集合: 如何编写适用于所有Immutable

  • 我需要序列化/反序列化特定枚举: 我有个例外: 我如何通过GSON序列化/反序列化它?

  • 奇怪的是下面的测试用例会失败。有人知道为什么吗?

  • 当JSON字符串{“a”:1}被反序列化时,数字100应该添加到值1中。在jsonb中,这是通过setter方法实现的,但Gson忽略了setter方法。如何让Gson使用setter方法?或者,如果这不可能,2022年,Gson中的setter推荐的替代方案是什么?

  • 我试图反序列化这个json对象数组: 我的java类看起来像这样: 问题在于json的tags属性,它可以是空字符串或数组。现在gson给了我一个错误: 我应该如何反序列化这个json? 我对这个json没有任何控制,它来自第三方api。

  • 课程对象不包装在标记中 某些属性是属性 我需要如何注释我的对象以使FasterXML反序列化这个XML?