使用GSON仅序列化嵌套的JSON

时间:2016-04-07 23:28:16

标签: java json api gson retrofit

我有一个API可以返回一些可以说是有用的元数据以及请求的数据本身。它看起来像这样:

{
"success": true,
"messages": [],
/* other metadata */
"result":  { /* fields with useful data */ }
}

所以,基本上我只想序列化嵌套在“result”字段中的东西,最好还是能够使用meta(在true / false上检查“success”并读取消息可能很有用)。

我以为我可以使用JSONObject来分离“结果”和其他元,但这个管道感觉有点开销。有没有办法纯粹用GSON做到这一点?

另一个问题是我使用的是Retrofit,它具有非常简洁的纯GSON工作流程。如果以上是处理此类API的唯一适当方式,我应该如何将其集成到Retrofit工作流程中呢?

2 个答案:

答案 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();