【发布时间】:2018-08-09 07:32:11
【问题描述】:
我使用 gson 进行反序列化。我的类有一个实例字段,它是一个 Object 类型,因为有时它可以用 String 或 Date 对象实例化。但是在反序列化时,我无法将它作为 Date 或 String 类型。 我知道有一个使用 RuntimeTypeAdapterFactory 的解决方案,但我不能使用它,因为我无法添加 RuntimeTypeAdapterFactory 解决方案 (https://futurestud.io/tutorials/how-to-deserialize-a-list-of-polymorphic-objects-with-gson),因为我无法将“类型”字段添加到 java.lang.String 或 java.util.Date。
有什么办法可以解决这个问题吗?
请查看此问题的示例代码
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;
public class GsonSer {
String name;
Object dob;
public GsonSer(String name, Date dob) {
this.name = name;
this.dob = dob;
}
static class JsonDateSerDeserializer implements JsonSerializer<Date>, JsonDeserializer<Date> {
@Override
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getTime());
}
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Date parsed = new Date(json.getAsLong());
return parsed;
}
}
public static void main(String[] args) {
GsonSer ser = new GsonSer("name", new Date());
Type DATE_TYPE = new TypeToken<Date>() {
}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(DATE_TYPE, new JsonDateSerDeserializer())
.create();
String date = gson.toJson(ser);
System.out.println("Original = " + ser.dob + "\n");
GsonSer deser = gson.fromJson(date, GsonSer.class);
System.out.println("after deser = " + deser.dob + "\n");
}
}
//输出
原文 = 2018 年 8 月 9 日星期四 10:13:24 CEST
在deser = 1.533802404071E12之后
【问题讨论】:
-
能否请您添加您的代码给出的输出?
-
反序列化后dob显示为双精度值
-
感谢您的快速回归!