告诉改造应该映射某个json字段的变量?

iDa*_*N5x 12 json gson retrofit

我正在谈论的REST API正在响应结构中的一些请求:

{
  "_links": {
    "next": "NEXT_DATA_BLOCK_URL",
    "prev": "PREV_DATA_BLOCK_URL",
    "self": "CURRENT_DATA_BLOCK_URL"
  },
  "RESPONSE_DATA_NAME": [
    {
      ... DATA_FIELDS ...
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

'RESPONSE_DATA_NAME'是数据"名称" - 根据所需要求进行更改.例如,它可能是"团队"或"消息".

因此,我创建了一个包含以下成员的泛型类:

public class PagedResponse<T> {
  public PagingLinks _links;
  public List<T> _data;
}
Run Code Online (Sandbox Code Playgroud)

我有没有办法设置我的RestAdapter,以便它总是将'RESPONSE_DATA_NAME'映射到'_data'成员,无论字段名称实际是什么?

谢谢^ _ ^

Asi*_*tto 19

使用gson,你可以使用@SerializedName.注释你的_data字段.此批注的参数(值)是序列化和反序列化对象时要使用的名称.例如,Java字段_ data表示为RESPONSE_DATA_NAMEJSON.

public class PagedResponse<T> {

    public PagingLinks _links;
    @SerializedName(value="RESPONSE_DATA_NAME")
    public List<T> _data;
}
Run Code Online (Sandbox Code Playgroud)

进一步看文档


如果你想控制json字段,那么你必须编写自定义反序列化器,如下所示

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;

    }
}
Run Code Online (Sandbox Code Playgroud)

终于解析了

 GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PagedResponse.class, new CustomDeserializer());
Gson gson = gsonBuilder.create();

gson.fromJson(Your_JSON_STRING_HERE, PagedResponse.class);
Run Code Online (Sandbox Code Playgroud)