【问题标题】:How to deserialise a date with a space using GSON?如何使用 GSON 反序列化带有空格的日期?
【发布时间】:2015-09-12 11:00:13
【问题描述】:

我有一个我正在尝试反序列化的 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);

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

【问题讨论】:

  • 空格不是问题......而且永远不会在引号内或引号外。您发布的是有效的 json。这个问题必须比您发布的内容更多。你能提供这个 json 的上下文吗?
  • 抱歉,我忘了提及其他错误消息,这就是我假设空格的原因 - 请查看我的编辑。

标签: android gson


【解决方案1】:

从这里: malformedjsonexception 我确实相信您的 JSON 中有一个错误的“空格”,GSON 将其视为无效:

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

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

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

意思是你必须做this

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      可能是你的文字输入,

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

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

      【讨论】:

      • 感谢提醒,最后确实是我的意见。我将 fromJson 输入更改为 JsonElement 而不是 String,现在它可以正常工作了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2013-02-01
      相关资源
      最近更新 更多