【问题标题】:Use Gson/Retrofit on SerializedName which is unknown beforehand在事先未知的 SerializedName 上使用 Gson/Retrofit
【发布时间】:2018-03-26 11:20:19
【问题描述】:

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

    {
       "29593": { ..object to parse },
       "29594": { ..object to parse },
       "29600": { ..object to parse }
    }

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

有可能吗?

【问题讨论】:

  • 是的。可以,但不能与 Retrofit/Gson 一起使用
  • 我觉得你用 Gson 做不到,也许 Moshi 可以帮忙
  • @VinayakB - 让我纠正你,她可以使用 Retrofit,但用于获取原始 JSON 响应。之后,将需要自定义解析选项。
  • 您可以使用ObjectMapper 将您的JSONObject 更改为HashMap<Integer, Object>。然后迭代键..并按照您的意愿执行..谢谢...
  • 所以基本上,我需要手动解析它吗?好的,但即使使用 JSONObject obj = new JSONObject(RESPONSE_BODY);字符串 innerObj= obj.getJSONObject("KEY") ;我需要事先知道 KEY:/

标签: java android gson retrofit2


【解决方案1】:

解决方案是使用来自 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 builder:

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

【讨论】:

  • 这不起作用,因为 JsonDesrializationContext 将导致运行相同的反序列化方法,有效地在无限循环中运行
  • @Hrafn nope,你错了,我们的反序列化器只能反序列化 MyModel.class,不能反序列化 ItemOfMyModel.class
猜你喜欢
  • 2016-04-17
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多