您希望您的模型類看起來如何?
status
和total
可能是int
,所以只留下info
。
作爲一個實驗,只需添加一個字段Object info
,看看GSON將其設置爲ArrayList<LinkedHashMap<String, String>>
- 醜陋不堪,通過密鑰訪問,但所有的數據是存在的。鑑於信息,一類模型的最快方法是:
class Something {
int status;
List<Map<String, String> info;
int total;
}
如果你有過怎樣的生成JSON,我建議從對象[{a:b},{c:d},{e:f}]
只是一個對象{a:b,c:d,e:f}
數組改變info
結構控制。
class Something {
int status;
Map<String, String> info;
int total;
}
如果你想在不改變JSON格式,後者模型類,你必須寫:有了這個,你可以只將其與所有喜歡的密鑰訪問,keys()
和values()
好處映射到Map<String, String>
一個TypeAdapter
(或JsonDeserializer
,如果你只是感興趣的解析JSON,而不是從你的模型類生成它)。
這裏有一個JsonDeserializer帽子將您的原始info
JSON屬性映射到一個普通的Map<String, String>
。
class ArrayOfObjectsToMapDeserializer
implements JsonDeserializer<Map<String, String>> {
public Map<String, String> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
Map<String, String> result = new HashMap<String, String>();
JsonArray array = json.getAsJsonArray();
for (JsonElement element : array) {
JsonObject object = element.getAsJsonObject();
// This does not check if the objects only have one property, so JSON
// like [{a:b,c:d}{e:f}] will become a Map like {a:b,c:d,e:f} as well.
for (Entry<String, JsonElement> entry : object.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().getAsString();
result.put(key, value);
}
}
return result;
}
}
您需要註冊與此類似這種風俗JsonDeserializer
:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(
new TypeToken<Map<String, String>>() {}.getType(),
new ArrayOfObjectsToMapDeserializer());
Gson gson = builder.create();
注意不管此註冊了任何Map<String, String>
自定義解串器中遇到什麼課了。如果你不想要這個,你還需要創建一個自定義的TypeAdapterFactory
,然後在返回之前檢查聲明類以及解串器的實例。
鍵怎麼來是動態的?我認爲鍵的內容可以是動態的...你是否自己手動生成json字符串...? – waqaslam 2012-04-22 12:06:22