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