Android 如何使用改型处理对象列表或单个对象的JSON响应?

Android 如何使用改型处理对象列表或单个对象的JSON响应?,android,arrays,json,rest,retrofit,Android,Arrays,Json,Rest,Retrofit,我正在调用一个REST服务,而不是我的,它使用的是改型,如果有多个对象,则返回一个对象列表,如果有一个对象,则返回一个对象列表。我发现了一个类似的问题,但是建议更改我无法控制的API。我还阅读了thread,这似乎是一个很好的方法,但有没有办法通过改型来处理这个问题?您可以将API响应数据作为响应中的映射,然后根据您的需求直接解析它。您可以在这里检查JsonElement是否为JsonArray 例如: public fun parseData(val jsonElement:JsonEleme

我正在调用一个REST服务,而不是我的,它使用的是改型,如果有多个对象,则返回一个对象列表,如果有一个对象,则返回一个对象列表。我发现了一个类似的问题,但是建议更改我无法控制的API。我还阅读了thread,这似乎是一个很好的方法,但有没有办法通过改型来处理这个问题?

您可以将API响应数据作为响应中的映射,然后根据您的需求直接解析它。您可以在这里检查JsonElement是否为JsonArray

例如:

public fun parseData(val jsonElement:JsonElement){

  val gson = Gson()

  if(jsonElementFromServer.isJsonArray()){
    //here you can just parse it into some list of array

  }else{
    //here you can parse using gson to single item element or model 

  }

}

使用Gson获取项目或单个

作为您提到的第二篇文章的作者,我还提到了该文章中描述的PostArrayOrSingleDeserializer的实现

在将Gson与改装的converter Gson一起使用时,您只需向自定义Gson实例注册适配器,并使用该Gson实例构建改装实例,请参见下面的示例帮助器类:

public class MyRetrofit {
    public static MyAPI getMyApi() {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Object.class,
                        new ObjectArrayOrSingleDeserializer())
                .create();
        Retrofit retrofit = new Retrofit.Builder()  
                .baseUrl("https://example.org")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        return retrofit.create(MyAPI.class);
    }
}

因此,JsonDeserializer中名为ObjectArrayOrSingleDeserializer的对象就是您需要检查单个实例或数组的DTO。用相应的DTO替换对象,并相应地修改反序列化程序。

虽然@pirho的答案似乎是适用的,但我发现了一个不同的简单解决方案,它对我很有效。希望它也能帮助其他人

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(JacksonConverterFactory.create(mapper))
            .client(okHttpClient)
            .build();

也许这会有帮助。请添加一些代码,至少是您的对象类谢谢。会不会碰巧有一段杰克逊的代码而不是格森的?