将单个 string/date 从 JsonObject 反序列化为 java 中的字符串
Deserialize single string/date from JsonObject to string in java
我有一个序列化的 json-日期。我想知道我是否可以像在 c# 中那样使用 json-date 反序列化单个字符串。但是在 java 中如何做到这一点?
这是 C# 代码:
DateTime dateTime = JsonConvert.DeserializeObject<DateTime>(string);
希望有人能提供帮助,我不需要创建一个整体 class 来做到这一点。
编辑:
这是字符串:“/Date(1630050818893+0300)/”
由于您正在尝试反序列化旧的 .NET 文本日期格式,因此您必须为 Date
类型设置 GSON JsonDeserializer
。
您可以实现一种匹配并从 String
日期中提取 timestamp
值,如下所示:
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DateDeserializer implements JsonDeserializer<Date> {
private static final Pattern DATE_PATTERN = Pattern.compile("/Date\((-?\d+).*\)/");
@Override
public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
throws JsonParseException {
final Matcher matcher = DATE_PATTERN.matcher(jsonElement.getAsString());
if (matcher.matches()) {
final String timestamp = matcher.group(1);
return new Date(Long.parseLong(timestamp));
} else {
throw new IllegalArgumentException(jsonElement.getAsString() + " does not match /Date(timestamp)/ pattern");
}
}
}
然后您可以将自定义 DateDeserializer
注册为您的 java.util.Date
类型反序列化器(假定您在 POJO 类型中使用此类型):
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateDeserializer())
.create();
ObjectWithDate objectWithDate = gson.fromJson(json, ObjectWithDate.class);
其中 ObjectWithDate
是包含 java.util.Date
字段的模板对象:
public class ObjectWithDate {
private final Date date;
public ObjectWithDate(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
@Override
public String toString() {
return "ObjectWithDate{" +
"date=" + date +
'}';
}
}
我有一个序列化的 json-日期。我想知道我是否可以像在 c# 中那样使用 json-date 反序列化单个字符串。但是在 java 中如何做到这一点?
这是 C# 代码:
DateTime dateTime = JsonConvert.DeserializeObject<DateTime>(string);
希望有人能提供帮助,我不需要创建一个整体 class 来做到这一点。
编辑: 这是字符串:“/Date(1630050818893+0300)/”
由于您正在尝试反序列化旧的 .NET 文本日期格式,因此您必须为 Date
类型设置 GSON JsonDeserializer
。
您可以实现一种匹配并从 String
日期中提取 timestamp
值,如下所示:
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DateDeserializer implements JsonDeserializer<Date> {
private static final Pattern DATE_PATTERN = Pattern.compile("/Date\((-?\d+).*\)/");
@Override
public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
throws JsonParseException {
final Matcher matcher = DATE_PATTERN.matcher(jsonElement.getAsString());
if (matcher.matches()) {
final String timestamp = matcher.group(1);
return new Date(Long.parseLong(timestamp));
} else {
throw new IllegalArgumentException(jsonElement.getAsString() + " does not match /Date(timestamp)/ pattern");
}
}
}
然后您可以将自定义 DateDeserializer
注册为您的 java.util.Date
类型反序列化器(假定您在 POJO 类型中使用此类型):
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateDeserializer())
.create();
ObjectWithDate objectWithDate = gson.fromJson(json, ObjectWithDate.class);
其中 ObjectWithDate
是包含 java.util.Date
字段的模板对象:
public class ObjectWithDate {
private final Date date;
public ObjectWithDate(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
@Override
public String toString() {
return "ObjectWithDate{" +
"date=" + date +
'}';
}
}