我有一个API可以返回一些可以说是有用的元数据以及请求的数据本身。它看起来像这样:
{
"success": true,
"messages": [],
/* other metadata */
"result": { /* fields with useful data */ }
}
所以,基本上我只想序列化嵌套在“result”字段中的东西,最好还是能够使用meta(在true / false上检查“success”并读取消息可能很有用)。
我以为我可以使用JSONObject来分离“结果”和其他元,但这个管道感觉有点开销。有没有办法纯粹用GSON做到这一点?
另一个问题是我使用的是Retrofit,它具有非常简洁的纯GSON工作流程。如果以上是处理此类API的唯一适当方式,我应该如何将其集成到Retrofit工作流程中呢?
答案 0 :(得分:0)
到您的改造生成器添加:
.addConverterFactory(new GsonConverterFactory(new GsonBuilder()
.registerTypeAdapter(Result.class, new JsonDeserializer<Result>() {
@Override
public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if(!(((JsonObject) json).getAsJsonPrimitive("success")).getAsBoolean()) {
return null;
}
JsonObject result = ((JsonObject) json).getAsJsonObject("result");
return new Gson().fromJson(result, Result.class);
}
}).create()))
当然有npe和其他检查:)
答案 1 :(得分:0)
使用@Expose注释创建POJO并使用serialization = true / false。如果您只想序列化成功,那么您的POJO将会是这样的。
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class POJO {
@SerializedName("success")
@Expose(serialize = true, deserialize = false)
private Boolean success;
///Your getter / setter methods
}
我已将上述内容与Retrofit一起使用,效果很好。
希望这有帮助!
修改强>
此外,您还需要在创建改造服务时提及此内容
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.excludeFieldsWithoutExposeAnnotation();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(YOUR_BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()))
.build();