java - 在事先未知的 SerializedName 上使用 Gson/Retrofit

标签 java android gson retrofit2

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

    {
       "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 构建器:

Gson gson = new GsonBuilder()
            .registerTypeAdapter(MyModel.class, new MyAwesomeDeserializer())
            .create()

关于java - 在事先未知的 SerializedName 上使用 Gson/Retrofit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49490230/

相关文章:

java - 当我将 jframe 作为参数传递给另一个方法时,出现空白帧

android - 在纵向模式android中防止滚动

java - 根据屏幕尺寸翻译动画

java - 将 GeoJson 转换为 mapbox Polygon 对象 (Android)

java - 如何使用 java 提供以下 json 输出

java - 列表的 var 参数作为方法参数

Java gRPC 服务器用于长生命周期流的有效实现

java - 如何将输入流转换为java对象

android - 一个 Android 应用程序中存在两个进程。真的吗?

android - Gson在解析json字符串时将int转换为double