需要用gson解析json数组。这些项目包含一个根据其类型而不同的属性

时间:2018-08-22 14:38:48

标签: android gson

我有一个包含小部件列表的json数组。但是每个小部件根据其类型都有不同的数据。我需要使用GSON android库解析此JSON。我采用的方法是:我采用了包含WidgetModel列表的响应模型。 WidgetModel是类型类型。我还为该类型定义了各种类型的数据。 为此,我创建了一个gson解串器,但是它不适用于我。

请检查以下给出的json:

{
  "page_title": "Invite And Earn",
  "widgets": [
    {
      "type": "image",
      "index": 0,
      "title": null,
      "ic_link": null,
      "data": [
        {
          "link": "https://www.dike.li.us/images/sample-1.jpg"
        }
      ]
    },
    {
      "type": "text",
      "index": 1,
      "title": null,
      "ic_link": null,
      "data": [
        {
          "text": "Invite your friends. "
        }
      ]
    },
    {
      "type": "ref_code",
      "index": 2,
      "title": null,
      "ic_link": null,
      "data": [
        {
          "label": "Your Invite Code:",
          "code": "AMANOV8KR"
        }
      ]
    },
    {
      "type": "line",
      "title": null,
      "ic_link": null,
      "index": 3,
      "data": [
        {
          "style": "full"
        }
      ]
    }
  ]
}

Deseirializer代码为:

public class GsonDeserializer implements JsonDeserializer<WidgetRespModal> {

    @Override
    public WidgetRespModal deserialize(JsonElement json, Type typeOfT,
                                       JsonDeserializationContext context) throws JsonParseException {
        Type type = null;
        switch (json.getAsJsonObject().get("type").getAsString()) {
            case WidgetRespModal.WidgetType.IMAGE_WIDGET:
                type = new TypeToken<ArrayList<ImageWidgetConfig>>() {
                }.getType();
                break;
            case WidgetRespModal.WidgetType.LINE_WIDGET:
                type = new TypeToken<ArrayList<LineWidgetConfig>>() {
                }.getType();
                break;
            case WidgetRespModal.WidgetType.LINK_WIDGET:
                type = new TypeToken<ArrayList<LinkWidgetConfig>>() {
                }.getType();
                break;

            case WidgetRespModal.WidgetType.TEXT_WIDGET:
                type = new TypeToken<ArrayList<TextWidgetConfig>>() {
                }.getType();
                break;
        }
        WidgetRespModal respModal = new WidgetRespModal();
        if(json.isJsonObject()){
            JsonObject respJson = json.getAsJsonObject();
            respModal.setType(respJson.get("type").getAsString());
            respModal.setIndex(respJson.get("index").getAsInt());
            respModal.setIconLink(respJson.get("ic_link").getAsString());
            respModal.setTitle(respJson.get("title").getAsString());
            respModal.setConfig((List) context.deserialize(respJson.get("data").getAsJsonArray(), type));

        }
        return respModal;
    }
}

2 个答案:

答案 0 :(得分:0)

使用Gson

Type type = new TypeToken<List<Student>>(){}.getType();     
List<Student> students = gson.fromJson(json, type);

有关更多信息,请查看帖子

https://stackoverflow.com/a/15011927/6742601

答案 1 :(得分:0)

对于这个简单的用例,没有必要创建反序列化器。

以下行就足够了 新的Gson()。toJson(strResponse,WidgetRespModal.class);