gpt4 book ai didi

android - 使用 Retrofit 时手动解析部分响应

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:32:40 26 4
gpt4 key购买 nike

我正在使用一个 REST API,该 API 返回一个 JSON 文档,该文档以如下方式开头,并包含一个“集合”,其中包含带有“ABC”等字符串 ID 的项目。注意“routes”字段,它包含一系列名为“ABC”、“ABD”、“ABE”等的字段,但是 routes 在 json 中并没有表示为数组,所以所有这些

{
"status":true,
"page":1,
"per_page":500,
"total_count":1234,
"total_pages":8,
"total_on_page":500,
"routes":{
"ABC":[
{
"value":22313,
<......>

我正在使用 Retrofit,问题是路线字段不是数组(尽管从概念上讲它确实是数组)并且 Retrofit/Gson 要求我为具有字段变量 abc、abd 等的路线创建模型对象 -随着数据的变化,这是不切实际的。由于各种原因,更改服务器 API 很困难,所以我希望在 Android 客户端上解决这个问题。

我认为这些是选项:

  • 在 JSON 文档到达 Gson 之前拦截它并调整文档,可能使用自定义的 Gson 解析器,或通过拦截 HTTP 响应。

  • 绕过 JSON 解析,从 Retrofit 获取 JSON 文档(我还没有弄清楚如何做到这一点,或者是否可能)

  • 使用 Retrofit 的一些我不知道的功能将字段名称映射到集合。

我很感激帮助,特别是如果有一个快速简单的方法来解决这个问题。

最佳答案

事实证明,Retrofit 默认使用 Gson 使得添加自定义反序列化器来处理出现问题的 JSON 文档部分变得相当容易。

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(ApiDefinition.BASE_URL)
.setConverter(getGsonConverter())
.build();

public Converter getGsonConverter() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(RouteList.class, new RouteTypeAdapter())
.create();
return new GsonConverter(gson);
}


public class RouteTypeAdapter implements JsonDeserializer<RouteList> {
@Override
public RouteList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Gson gson = new Gson();
RouteList routeList = new RouteList();
JsonObject jsonObject = json.getAsJsonObject();
for (Map.Entry<String,JsonElement> elementJson : jsonObject.entrySet()){
RouteList wardsRoutes = gson.fromJson(elementJson.getValue().getAsJsonArray(), RouteList.class);
routeList.addAll(wardsRoutes);
}
return routeList;
}

}

关于android - 使用 Retrofit 时手动解析部分响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26099133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com