Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在改造中向Gson注册自定义TypeAdapter或JsonDeserializer?_Java_Gson_Retrofit_Retrofit2_Json Deserialization - Fatal编程技术网

Java 如何在改造中向Gson注册自定义TypeAdapter或JsonDeserializer?

Java 如何在改造中向Gson注册自定义TypeAdapter或JsonDeserializer?,java,gson,retrofit,retrofit2,json-deserialization,Java,Gson,Retrofit,Retrofit2,Json Deserialization,我在我的项目中使用改型,我需要一些自定义反序列化,以及我使用的API返回的一些响应 举个例子:我收到的JSON如下: { "status": "7 rows processed" } (如果请求失败,将“处理0行”) 我需要反序列化到如下对象: @Getter @RequiredArgsConstructor public static class Result { private final boolean success; } 我已创建自定义反序列化程序: public clas

我在我的项目中使用改型,我需要一些自定义反序列化,以及我使用的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
。因此,在使用custom
JsonDeserializer
定制了
Gson
之后,如有疑问:

Gson customGson = new GsonBuilder()
    .registerTypeAdapter(Result.class, new ResultDeserializer())
    .create();
需要在
GsonConverterFactory
的帮助下,在构建阶段将此
Gson
实例注册到
改造

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