Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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反序列化程序支持多种类型_Java_Json_Gson_Json Deserialization - Fatal编程技术网

Java Gson反序列化程序支持多种类型

Java Gson反序列化程序支持多种类型,java,json,gson,json-deserialization,Java,Json,Gson,Json Deserialization,我想反序列化JSON响应,但我不确定其格式。格式在每种情况下都可能有所不同。例如,响应包含一个名为error的字段,该字段可能是假布尔值,或者包含一个描述错误的对象,例如error:{code:xxx,description:etc} 我应该如何实现一个涵盖这两种情况的类?有没有办法做到这一点 谢谢对于您的案例,我更喜欢使用TypeAdapter: private static class Error { private boolean hasError; private int

我想反序列化JSON响应,但我不确定其格式。格式在每种情况下都可能有所不同。例如,响应包含一个名为error的字段,该字段可能是假布尔值,或者包含一个描述错误的对象,例如error:{code:xxx,description:etc}

我应该如何实现一个涵盖这两种情况的类?有没有办法做到这一点


谢谢

对于您的案例,我更喜欢使用TypeAdapter:

private static class Error {
    private boolean hasError;
    private int code;
    private String description;
}

private static class ErrorTypeAdapter extends TypeAdapter<Error> {

    @Override
    public Error read(JsonReader jsonReader) throws IOException {
        Error response = null;

        jsonReader.beginObject();

        while (jsonReader.hasNext()) {
            String currentJsonName = jsonReader.nextName();
            if("error".equals(currentJsonName)) {
                response = new Error();
                try {
                    response.hasError = jsonReader.nextBoolean();
                } catch (Exception e) {
                    response.hasError = true;
                    jsonReader.beginObject();
                }
            } else if("code".equals(currentJsonName)) {
                response.code = jsonReader.nextInt();
            } else if ("description".equals(currentJsonName)) {
                response.description = jsonReader.nextString();
            }
        }
        if(response.hasError) {
            jsonReader.endObject();
        }
        jsonReader.endObject();

        return response;
    }

    @Override
    public void write(JsonWriter jsonWriter, Error response)
            throws IOException {
        jsonWriter.beginObject();
        jsonWriter.name("hasError").value(response.hasError);
        jsonWriter.name("code").value(response.code);
        jsonWriter.name("description").value(response.description);
        jsonWriter.endObject();
    }

}

您可以阅读有关TypeAdapters的更多信息以及一些很好的示例。

反序列化到映射和列表中,然后在访问数据时检查数据。为什么是“jsonReader.endObject;”调用2次?@ApollonDigital如果您调试测试用例val1和val2,您就会理解它。如果错误json值返回布尔值,则它将是一个基元类型。但若error json value返回一个代码和一个desc字符串值,那个么它将是一个内部对象,它还需要一个beginObject和endObject.Nice。。。但是我还有另一个名为response的字段:{…}当响应的error为false时,在error字段后面?我是否可以调用响应部分的默认读取器?@ApollonDigital是的,您可以。您最好阅读我共享的链接,并尝试理解TypeAdapters。您将简单实现您的目标,并将更好地了解gson及其酷炫功能。
String val1 = "{\"error\": {\"code\": 1 , \"description\":\"etc\"}}";
String val2 = "{\"error\": false}";

final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Error.class, new ErrorTypeAdapter());
gsonBuilder.setPrettyPrinting();

final Gson gson = gsonBuilder.create();

gson.fromJson(val1, Error.class);
gson.fromJson(val2, Error.class);