反序列化为 class 使用 Gson 扩展 LinkedHashMap
Deserializing into class extending LinkedHashMap with Gson
我正在尝试从 JSON 反序列化为 class,它使用 Gson 扩展了 LinkedHashMap。我可以直接在 LinkedHashMap 中简单地执行此操作,但是当我尝试使用 LinkedHashMap 的 sub-class 时,出现错误
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $.
我需要使用的类型(我没有这个,所以没有选择使用其他任何东西):
public class ValueMap extends LinkedHashMap<CharSequence, Object> {}
我必须定义一个 InstanceCreator 来解决 CharSequence 的问题。我尝试反序列化的 JSON 作为一个基本示例是:
{"people":[{"name":"name1","surname":"name2","age":12,"dogs":["spot","fluffy","batman"],"cars":[{"name":"name1","model":1933},{"name":"name2","model":343}]},{"name":"name2","surname":"name2","age":44,"dogs":["spot","test","jack"]}]}
已更新以包含 serialization/deserialization 代码:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceInstanceCreator());
Gson gson = gsonBuilder.create();
String serialized = gson.toJson(value);
LinkedHashMap<CharSequence, Object> deserialized = gson.fromJson(serialized, ValueMap.class);
CharSequenceInstanceCreator 看起来像:
public static class CharSequenceInstanceCreator implements InstanceCreator<CharSequence> {
@Override
public CharSequence createInstance(Type arg0) {
return new String();
}
}
定义 JsonDeserializer 而不是 InstanceCreator。
public static class CharSequenceDeserializer implements JsonDeserializer<CharSequence> {
@Override
public CharSequence deserialize(JsonElement element, Type type,
JsonDeserializationContext context) throws JsonParseException {
return element.getAsString();
}
}
并注册。
// gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceInstanceCreator());
gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceDeserializer());
我正在尝试从 JSON 反序列化为 class,它使用 Gson 扩展了 LinkedHashMap。我可以直接在 LinkedHashMap 中简单地执行此操作,但是当我尝试使用 LinkedHashMap 的 sub-class 时,出现错误
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $.
我需要使用的类型(我没有这个,所以没有选择使用其他任何东西):
public class ValueMap extends LinkedHashMap<CharSequence, Object> {}
我必须定义一个 InstanceCreator 来解决 CharSequence 的问题。我尝试反序列化的 JSON 作为一个基本示例是:
{"people":[{"name":"name1","surname":"name2","age":12,"dogs":["spot","fluffy","batman"],"cars":[{"name":"name1","model":1933},{"name":"name2","model":343}]},{"name":"name2","surname":"name2","age":44,"dogs":["spot","test","jack"]}]}
已更新以包含 serialization/deserialization 代码:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceInstanceCreator());
Gson gson = gsonBuilder.create();
String serialized = gson.toJson(value);
LinkedHashMap<CharSequence, Object> deserialized = gson.fromJson(serialized, ValueMap.class);
CharSequenceInstanceCreator 看起来像:
public static class CharSequenceInstanceCreator implements InstanceCreator<CharSequence> {
@Override
public CharSequence createInstance(Type arg0) {
return new String();
}
}
定义 JsonDeserializer 而不是 InstanceCreator。
public static class CharSequenceDeserializer implements JsonDeserializer<CharSequence> {
@Override
public CharSequence deserialize(JsonElement element, Type type,
JsonDeserializationContext context) throws JsonParseException {
return element.getAsString();
}
}
并注册。
// gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceInstanceCreator());
gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceDeserializer());