Gson解串器支持多种类型

时间:2014-10-19 11:19:59

标签: java json gson json-deserialization

我想反序列化JSON响应,但我不确定格式。格式可以在每种情况下变化。例如,响应包含名为“error”的字段,该字段可以是false(布尔值)或描述错误的对象,例如。 “错误”:{“code”:xxx,“description”:“etc”}

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

由于

1 个答案:

答案 0 :(得分:0)

我更喜欢在你的情况下使用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();
    }

}

要测试它,您可以使用:

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);

您可以详细了解TypeAdapters here以及一些很好的示例here