如何在翻新中向Gson注册自定义TypeAdapter或JsonDeserializer?

时间:2019-12-28 18:38:52

标签: java gson retrofit retrofit2 json-deserialization

我在项目中使用Retrofit,并且需要一些自定义反序列化以及我使用的API返回的某些响应。

仅作为示例:我收到类似JSON的

{ "status": "7 rows processed" }

(如果请求失败,将为“已处理0行”)

,我需要反序列化为类似这样的对象:

@Getter
@RequiredArgsConstructor
public static class Result {
    private final boolean success;
}

我已经创建了自定义反序列化器:

public class ResultDeserializer implements JsonDeserializer<Result> {
    @Override
    public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        return new Result( ! json.getAsJsonObject().get("status").getAsString().startsWith("0"));
    }
}

注册后,我可以测试它的工作原理:

Gson gson = new GsonBuilder().registerTypeAdapter(Result.class, new ResultDeserializer()).create(); 

注意:这个问题的意思是规范/常见问题解答,它是由我一年一次需要此信息时很难找到的一个启发。因此,如果该示例似乎是虚假的和愚蠢的,那仅仅是因为它应该很简单。希望这对其他人也有帮助

1 个答案:

答案 0 :(得分:0)

解决方案是在构建Gson客户端时注册自定义的Retrofit。因此,在像所讨论的那样使用自定义Gson自定义JsonDeserializer之后:

Gson customGson = new GsonBuilder()
    .registerTypeAdapter(Result.class, new ResultDeserializer())
    .create();

Gson的帮助下,需要在构建阶段向Retrofit注册此GsonConverterFactory实例:

Retrofit retrofit = new Retrofit.Builder()  
        .baseUrl("http://localhost:8080/rest/")
        .addConverterFactory(GsonConverterFactory.create(customGson))
        .build();