阅读JSON:
{"field":"value"}
进入String字段:
public class Test {
private String field;
}
使用Gson.fromJson
它按预期工作,成员String字段获取值“value”。
我的问题是,有没有办法将相同的JSON读入自定义类,以便可以使用String值构造自定义类对象? e.g。
public class Test {
private MyField<String> field;
}
public class MyField<T> {
private T value;
public MyField(T v) {
value = v;
}
}
String类的原因是final,无法扩展,但我不希望将JSON更改为:
{"field":{"value":"value"}}
如果有办法扩展String类,那就是最好的。否则,需要一种方法让Gson将字符串读入可以由字符串构造的自定义类。与编写自定义TypeAdapter
有什么关系?
答案 0 :(得分:1)
您可以使用自定义JsonDeserializer
,JsonSerializer
。这是一个简单的演示版本:
static class MyFieldAsValueTypeAdapter<T> implements
JsonDeserializer<MyField<T>>, JsonSerializer<MyField<T>> {
private Gson gson = new Gson();
@Override
public MyField<T> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
JsonObject obj = new JsonObject();
obj.add("value", json);
return gson.fromJson(obj, typeOfT);
}
@Override
public JsonElement serialize(MyField<T> src, Type typeOfSrc,
JsonSerializationContext context) {
return context.serialize(src.getValue());
}
}
public static void main(String[] args) {
GsonBuilder b = new GsonBuilder();
b.registerTypeAdapter(MyField.class , new MyFieldAsValueTypeAdapter());
Gson gson = b.create();
String json = "{\"field\":\"value1\"}";
Test test = gson.fromJson(json, Test.class);
}
小心内部Gson gson = new Gson()
。如果您有其他设置,则需要在内部版本上注册它或将默认的MyField反序列化器/序列化器传递给您的自定义实现。