gpt4 book ai didi

json - 告诉 Retrofit 它应该映射某个 json 字段的哪个变量?

转载 作者:行者123 更新时间:2023-12-04 00:41:54 24 4
gpt4 key购买 nike

我正在谈论的 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表示为 RESPONSE_DATA_NAME在 JSON 中。

public class PagedResponse<T> {

public PagingLinks _links;
@SerializedName(value="RESPONSE_DATA_NAME")
public List<T> _data;
}

进一步见 doc

如果要控制 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;

}
}

最后解析它
 GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PagedResponse.class, new CustomDeserializer());
Gson gson = gsonBuilder.create();

gson.fromJson(Your_JSON_STRING_HERE, PagedResponse.class);

关于json - 告诉 Retrofit 它应该映射某个 json 字段的哪个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23524331/

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