这取决于您希望在您的 java 表示中具有什么数据结构。您可以选择 3 个选项:
选项 1 List 或 List<Object>(实际上 Objects 将是 LinkedHashMap、String、ArrayList)
new Gson().fromJson(JSON, ParentPOJO.class);
private static class ParentPOJO{
public List<Object> arguments;
}
选项 2 自定义 MyListClass 与 MyListClass 的自定义反序列化器 MyListClass extends ArrayList 这样您可以控制反序列化并为您的对象选择适当的数据类型。这将为您提供包含MyClass、ArrayList 和String 的MyListClass extends ArrayList。演示如下。
public static void main(String[] args) {
Gson gson = new GsonBuilder().registerTypeAdapter(MyListClass.class, new CustomDeserializer()).create();
map = gson.fromJson(JSON, ParentPOJO.class);
}
private static class ParentPOJO{
public MyListClass arguments;
}
private static class MyListClass extends ArrayList{}
private static class CustomDeserializer implements JsonDeserializer{
@Override
public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
MyListClass list = null;
if (json.isJsonArray()){
list = new MyListClass();
JsonArray array = json.getAsJsonArray();
for(int i = 0; i< array.size();i++){
Object next = parseNext(array.get(i),context);
list.add(next);
}
}
return list;
}
private Object parseNext(JsonElement json, JsonDeserializationContext context){
if (json.isJsonArray()){
return context.deserialize(json, Object.class);//can change object type if you know it
}else if(json.isJsonPrimitive()){
return json.getAsJsonPrimitive().getAsString();
}else if(json.isJsonObject()){
return context.deserialize(json, MyClass.class);
}
return null;
}
}
public class MyClass {
@SerializedName("codes")
private List<String> codes = new ArrayList<String>();
@SerializedName("arguments")
private Object arguments;
@SerializedName("defaultMessage")
private String defaultMessage;
@SerializedName("code")
private String code;
}
选项 3 几乎完全相同,但 MyPOJOClass 而不是 MyListClass 只需更改反序列化器,将字段添加到您的 MyPOJOClass 并将 json 数组映射到反序列化器中的 pojo 字段。如果您选择自定义 MyPOJOClass 的 3-d 选项,还必须创建自定义序列化程序
如果你的 json 数组中有多个相同类型的对象,你将不得不想出某种算法来在反序列化器中解析它们。