【问题标题】:Retrofit 2 response without model没有模型的改造 2 响应
【发布时间】:2018-03-21 15:34:48
【问题描述】:

这个问题只问了以下问题12 但他们没有解决我的问题。

问题:

假设我在http://www.example.com/getSomething 的api 将提供{"Status":"False"}

// desired
public Apiinter{
  @GET("http://www.example.com/getSomething")
  Observable<Boolean> getSomething();
}

我想要像 Observale&lt;Boolean&gt; 这样的东西作为返回,而不是在路上做任何额外的 POJO,如何实现这一点

我的尝试:

我可以使用 POJO/model(但我不想),我可以返回 JSONObjectJSONElement ,但这不会使 Observable&lt;Boolean&gt; 作为返回值

【问题讨论】:

  • 我可以尝试自定义转换器。但为什么不是 POJO?
  • 这只是 1 个 api 示例,我有 20 多个 api,只有 1 个变量在 json 中作为响应返回,所以想象一下制作这么多 pojo
  • 您试图仅传递原始数据类型是不合逻辑的。您还需要传递具有解析价值的键
  • 我确实知道,我只是在寻求实现或将其转换为所需的 Observable 的可能性

标签: android json retrofit2 rx-java2


【解决方案1】:

说实话,我仍然宁愿使用 20 多个 POJO,但您可能会考虑添加您的自定义 JsonDeserializer(假设您将使用 GSON 来解析您的 API 结果)。我能想到的反序列化器看起来是这样的:

   private static class BooleanDeserializer implements JsonDeserializer<Boolean> {
        @Override
        public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            JsonObject obj = json.getAsJsonObject();
            Set<Map.Entry<String, JsonElement>> entrySet = obj.entrySet();
            return ((JsonElement)entrySet.toArray()[0]).getAsBoolean();
        }
    }

然后像这样设置你的 Gson:

Gson gson = new GsonBuilder()
                .registerTypeAdapter(Boolean.class, new BooleanDeserializer()).create();

还有你的 RestAdapter:

final RestAdapter.Builder builder = new RestAdapter.Builder()
                ...
                .setConverter(gson);

您可能想稍微弄乱一下,当然,这只会在一定程度上节省您的工作量。我不知道您的 API 有何不同,但这对于您可能具有不同 API 结构但只有一个有用值的情况应该很有用。

【讨论】:

  • 不客气!我忘了提到你可能想要返回 Observable 而不仅仅是 Boolean (我不想深入研究,因为我并不真正精通 rx-java),但我相信你会管理的。
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多