简体   繁体   English

反序列化为使用Gson扩展LinkedHashMap的类

[英]Deserializing into class extending LinkedHashMap with Gson

I'm trying to deserialize from JSON into a class that extends LinkedHashMap with Gson. 我正在尝试从JSON反序列化为使用Gson扩展LinkedHashMap的类。 I'm able to do this trivially directly into a LinkedHashMap, but when I try to use the sub-class of LinkedHashMap, I get the error 我可以直接在LinkedHashMap中轻松完成此操作,但是当我尝试使用LinkedHashMap的子类时,出现错误

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $. java.lang.IllegalStateException:应为BEGIN_OBJECT,但在第1行第3列路径$处为STRING。

The type I need to use (I don't own this, so there's no option to use anything else): 我需要使用的类型(我不拥有此类型,因此无法选择使用其他任何类型):

public class ValueMap extends LinkedHashMap<CharSequence, Object> {}

I've had to define an InstanceCreator to work around issues with CharSequence. 我必须定义一个InstanceCreator来解决CharSequence的问题。 The JSON I'm trying to deserialize as a basic example is: 作为基本示例,我尝试反序列化的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"]}]}

Updated to include serialization/deserialization code: 更新以包括序列化/反序列化代码:

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);

Where CharSequenceInstanceCreator looks like: CharSequenceInstanceCreator如下所示:

public static class CharSequenceInstanceCreator implements InstanceCreator<CharSequence> {

    @Override
    public CharSequence createInstance(Type arg0) {
        return new String();
    }

}

Define JsonDeserializer instead of InstanceCreator. 定义JsonDeserializer而不是InstanceCreator。

public static class CharSequenceDeserializer implements JsonDeserializer<CharSequence> {

    @Override
    public CharSequence deserialize(JsonElement element, Type type,
            JsonDeserializationContext context) throws JsonParseException {
        return element.getAsString();
    }

}

and register it. 并注册。

//  gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceInstanceCreator());
gsonBuilder.registerTypeAdapter(CharSequence.class, new CharSequenceDeserializer());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM