一尘不染

Gson-根据字段值反序列化为特定对象类型

json

我想基于type字段值将json对象反序列化为特定类型的对象(使用Gson库),例如:

[
    {
          "type": "type1",
          "id": "131481204101",
          "url": "http://something.com",
          "name": "BLAH BLAH",
          "icon": "SOME_STRING",
          "price": "FREE",
          "backgroundUrl": "SOME_STRING"
    },
    {
        ....
    }
]

因此,type字段将具有不同(但已知)的值。基于该值,我需要将该json对象反序列化为适当的模型对象,例如:Type1Model,Type2Model等。我知道我可以轻松地在反序列化之前通过将其转换为JSONArray,迭代并确定应该反序列化为哪种类型来完成此操作。
。但是我认为这是丑陋的方法,我正在寻找更好的方法。有什么建议?


阅读 462

收藏
2020-07-27

共1个答案

一尘不染

您可以JsonDeserializer在将Json值解析为Java实例时实现并使用它。我将尝试通过一个代码向您展示这个想法:

1)定义您的自定义JsonDeserializer类,该类通过传入的json值的id属性创建不同的类实例:

class MyTypeModelDeserializer implements JsonDeserializer<MyBaseTypeModel> {

    @Override
    public MyBaseTypeModel deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
            throws JsonParseException {

        JsonObject jsonObject = json.getAsJsonObject();

        JsonElement jsonType = jsonObject.get("type");
        String type = jsonType.getAsString();

        MyBaseTypeModel typeModel = null;

        if("type1".equals(type)) {
            typeModel = new Type1Model();
        } else if("type2".equals(type)) {
            typeModel = new Type2Model();
        }
        // TODO : set properties of type model

        return typeModel;
    }
}

2)为您的Java对象的不同实例定义基类:

class  MyBaseTypeModel {
    private String type;
    // TODO : add other shared fields here
}

3)定义不同的Java对象类实例,以扩展您的基类:

class Type1Model extends MyBaseTypeModel {
    // TODO: add specific fields for this class
}

class Type2Model extends MyBaseTypeModel {
    // TODO: add specific fields for this class
}

4)在将json值解析为bean时使用这些类:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MyBaseTypeModel.class, new MyTypeModelDeserializer());
Gson gson = gsonBuilder.create();

MyBaseTypeModel myTypeModel = gson.fromJson(myJsonString, MyBaseTypeModel.class);

我目前无法测试,但希望您能理解。另外,此链接将非常有帮助。

2020-07-27