Java 在SerializedName上使用Gson/改装,这是事先未知的

Java 在SerializedName上使用Gson/改装,这是事先未知的,java,android,gson,retrofit2,Java,Android,Gson,Retrofit2,我需要从设计糟糕的web API获取数据,该API以JSONobject的形式返回对象列表: { "29593": { ..object to parse }, "29594": { ..object to parse }, "29600": { ..object to parse } } 我需要为这个响应创建POJO,但问题是这些整数在变化,它们就像对象ID。我不知道如何从JSON键中提取这些整数,然后在另一个POJO类中进一步使用内

我需要从设计糟糕的web API获取数据,该API以
JSON
object的形式返回对象列表:

    {
       "29593": { ..object to parse },
       "29594": { ..object to parse },
       "29600": { ..object to parse }
    }
我需要为这个响应创建
POJO
,但问题是这些整数在变化,它们就像对象ID。我不知道如何从
JSON
键中提取这些整数,然后在另一个
POJO
类中进一步使用内部
JSON
对象(当键具有固定值时,我知道基本
Gson
映射)


有可能吗

解决方案是使用gson库中的自定义JsonDeserializer,下面是一个示例:

public class MyAwesomeDeserializer implements JsonDeserializer<MyModel> {
    public MyModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject eJson = json.getAsJsonObject();
        Set<String> keys = eJson.keySet();
        MyModel myModel = new MyModel();
        for (String key: keys) {
            JsonObject asJsonObject = eJson.get(key).getAsJsonObject();
            ItemOfMyModel itemOfMyModel = context.deserialize(asJsonObject, ItemOfMyModel.class);
            myModel.addItemOfMyModel(itemOfMyModel);
        }
        return myModel;
    }
}

解决方案是使用gson库中的自定义JsonDeserializer,下面是一个示例:

public class MyAwesomeDeserializer implements JsonDeserializer<MyModel> {
    public MyModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject eJson = json.getAsJsonObject();
        Set<String> keys = eJson.keySet();
        MyModel myModel = new MyModel();
        for (String key: keys) {
            JsonObject asJsonObject = eJson.get(key).getAsJsonObject();
            ItemOfMyModel itemOfMyModel = context.deserialize(asJsonObject, ItemOfMyModel.class);
            myModel.addItemOfMyModel(itemOfMyModel);
        }
        return myModel;
    }
}

是 啊这是可能的,但不能用于改装/Gson我不认为您可以使用Gson,也许Moshi可以help@VinayakB-让我纠正你,她可以使用改型,但用于获得原始JSON响应。之后,将需要自定义解析选项。您可以使用
ObjectMapper
JSONObject
更改为
HashMap
。然后迭代这些键。。你想怎么做就怎么做。。谢谢…所以基本上,我需要手动解析它?好的,但即使使用JSONObject obj=新的JSONObject(RESPONSE_BODY);字符串innerObj=obj.getJSONObject(“KEY”);我需要事先知道钥匙。这是可能的,但不能用于改装/Gson我不认为您可以使用Gson,也许Moshi可以help@VinayakB-让我纠正你,她可以使用改型,但用于获得原始JSON响应。之后,将需要自定义解析选项。您可以使用
ObjectMapper
JSONObject
更改为
HashMap
。然后迭代这些键。。你想怎么做就怎么做。。谢谢…所以基本上,我需要手动解析它?好的,但即使使用JSONObject obj=新的JSONObject(RESPONSE_BODY);字符串innerObj=obj.getJSONObject(“KEY”);我需要事先知道KEY:/这不会起作用,因为jsondesrialization上下文会导致相同的反序列化程序方法在无限长的时间内有效地运行loop@Hrafn不,你错了,我们的反序列化程序只能对MyModel.class进行理想化,not ITEMOFMMODEL.CLASS这将不起作用,因为JSONDESRLIALIZATION上下文将导致相同的反序列化程序方法在无限时间内有效地运行loop@Hrafn不,你错了,我们的反序列化程序只能对MyModel.class进行理想化,而不能对ItemOfMyModel.class进行理想化