Oll*_*e C 7 android json gson retrofit
我正在使用一个REST API,它返回一个JSON文档,该文档以如下方式开始,并包含一个带有字符串ID(如"ABC")的项目的"集合".注意"routes"字段,它包含一系列名为"ABC","ABD","ABE"等的字段,但是路由在json中没有表示为数组,所以所有这些
{
"status":true,
"page":1,
"per_page":500,
"total_count":1234,
"total_pages":8,
"total_on_page":500,
"routes":{
"ABC":[
{
"value":22313,
<......>
Run Code Online (Sandbox Code Playgroud)
我正在使用Retrofit,问题是routes字段不是一个数组(尽管事实上它确实是这样)并且Retrofit/Gson要求我为具有字段变量abc,abd等的路由创建一个模型对象 - 这不是实际的数据变化.由于各种原因,更改服务器API很难,所以我希望在Android客户端上解决这个问题.
我认为这些是选项:
在它到达Gson之前拦截JSON文档并调整文档,可能使用自定义的Gson解析器,或者拦截HTTP响应.
绕过JSON解析,并从Retrofit获取JSON文档(我还没弄清楚如何执行此操作,或者是否可以)
使用我不知道的Retrofit的一些功能将字段名称映射到集合.
我很感激帮助,特别是如果有一种快速简便的方法来解决这个问题.
Oll*_*e C 11
事实证明,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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6565 次 |
| 最近记录: |