我正在谈论的REST API是响应一个结构中的一些请求:
{ "_links": { "next": "NEXT_DATA_BLOCK_URL","prev": "PREV_DATA_BLOCK_URL","self": "CURRENT_DATA_BLOCK_URL" },"RESPONSE_DATA_NAME": [ { ... DATA_FIELDS ... } ] }
“RESPONSE_DATA_NAME”是数据“名称” – 根据所需请求进行更改.例如,它可能是“团队”或“消息”.
因此,我创建了一个泛型类与以下成员:
public class PagedResponse<T> { public PagingLinks _links; public List<T> _data; }
有没有什么办法可以设置我的RestAdapter,以便它始终将“RESPONSE_DATA_NAME”映射到“_data”成员,无论实际是什么字段名称?
谢谢^ _ ^
解决方法
使用gson,您可以使用@SerializedName对_data字段进行注释.此注释的参数(值)是序列化和反序列化对象时要使用的名称.例如,Java字段_data在JSON中表示为RESPONSE_DATA_NAME.
public class PagedResponse<T> { public PagingLinks _links; @SerializedName(value="RESPONSE_DATA_NAME") public List<T> _data; }
进一步见doc
如果你想控制json字段,那么你必须像下面这样写自定义的de-serializer
public class CustomDeserializer implements JsonDeserializer<PagedResponse> { @Override public PagedResponse deserialize(final JsonElement json,final Type typeOfT,final JsonDeserializationContext context) throws JsonParseException { Gson gson = new Gson(); PagedResponse pagedResponse = new PagedResponse<>(); List list = new ArrayList<>(); pagedResponse = gson.fromJson(json,PagedResponse.class); Type listType = new TypeToken<List>() {}.getType(); Set<Entry<String,JsonElement>> enteries = json.getAsJsonObject().entrySet(); for (Entry<String,JsonElement> entry : enteries) { JsonElement jsonElement = (JsonElement) entry.getValue(); if (jsonElement.isJsonArray()) { list.add(gson.fromJson(jsonElement,listType)); } } pagedResponse.set_data(list); return pagedResponse; } }
终于解析了
GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(PagedResponse.class,new CustomDeserializer()); Gson gson = gsonBuilder.create(); gson.fromJson(Your_JSON_STRING_HERE,PagedResponse.class);