你希望你的模型类看起来如何?
status
并且total
可能会int
,所以只有叶子info
。
作为一个实验,只需添加一个字段Object info
并查看 Gson 将如何将其设置为ArrayList<LinkedHashMap<String, String>>
- 丑陋且难以通过键访问,但所有数据都在那里。鉴于这些信息,建模类的最快方法是:
class Something {
int status;
List<Map<String, String> info;
int total;
}
如果您可以控制 JSON 的生成方式,我建议将结构info
从对象数组更改[{a:b},{c:d},{e:f}]
为仅对象{a:b,c:d,e:f}
。有了这个,您可以将其映射到 aMap<String, String>
并具有所有好处,例如通过密钥访问,keys()
并且values()
:
class Something {
int status;
Map<String, String> info;
int total;
}
如果您想要后一个模型类而不更改 JSON 格式,则必须编写一个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
并在返回和反序列化器实例之前检查声明类。