我有一个包含小部件列表的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;
}
}
答案 0 :(得分:0)
使用Gson
Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);
有关更多信息,请查看帖子
答案 1 :(得分:0)
对于这个简单的用例,没有必要创建反序列化器。
以下行就足够了 新的Gson()。toJson(strResponse,WidgetRespModal.class);