如何使用 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());
}
}
我有一个 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());
}
}