GSON忽略类型错误的元素
我正在使用Retrofit(与OkHttp和GSON结合使用)与在线Web服务进行通信。该Web服务的所有响应都有一个默认包装,类似于:
{ "resultCode":"OK",
"resultObj":"Can be a string or JSON object / array",
"error":"",
"message":""
}
在此示例中,resultCode
将为OK
或NO
。此外error
,message
仅在处理请求时发生错误时才包含任何内容。最后但并非最不重要的一点resultObj
将包含调用的实际结果(示例中为字符串,但是某些调用返回JSON数组或JSON对象)。
为了处理此元数据,我创建了一个通用类,如下所示:
public class ApiResult<T> { private String error;
private String message;
private String resultCode;
private T resultObj;
// + some getters, setters etcetera
}
我还创建了代表有时给出的响应的类,resultObj
并定义了与Retrofit一起使用的接口,看起来像这样:
public interface SomeWebService { @GET("/method/string")
ApiResult<String> someCallThatReturnsAString();
@GET("/method/pojo")
ApiResult<SomeMappedResult> someCallThatReturnsAnObject();
}
只要请求有效,所有这些都可以正常工作。但是,当服务器端发生错误时,它仍然会返回resultObj
String类型的。这会导致someCallThatReturnsAnObject
Retrofit
RestAdapter / GSON库内部崩溃,并显示以下消息:
retrofit.RetrofitError:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:
预期为BEGIN_OBJECT,但位于第1行第110列的路径$ .resultObj
现在,最后,我的问题是:
- 有没有一种(简单的)方式告诉GSON如果它与期望的类型不匹配,就应该忽略(也就是“无效化”)一个属性?
- 我可以告诉GSON将空字符串视为null吗?
回答:
像这样定义模型:
public class ApiResult { private String error;
private String message;
private String resultCode;
private MyResultObject resultObj;
}
然后,为 : *
public class MyResultObjectAdapterFactory implements TypeAdapterFactory { @Override
@SuppressWarnings("unchecked")
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (type.getRawType()!= MyResultObject.class) return null;
TypeAdapter<MyResultObject> defaultAdapter = (TypeAdapter<MyResultObject>) gson.getDelegateAdapter(this, type);
return (TypeAdapter<T>) new MyResultObjectAdapter(defaultAdapter);
}
public class MyResultObjectAdapter extends TypeAdapter<MyResultObject> {
protected TypeAdapter<MyResultObject> defaultAdapter;
public MyResultObjectAdapter(TypeAdapter<MyResultObject> defaultAdapter) {
this.defaultAdapter = defaultAdapter;
}
@Override
public void write(JsonWriter out, MyResultObject value) throws IOException {
defaultAdapter.write(out, value);
}
@Override
public MyResultObject read(JsonReader in) throws IOException {
/*
This is the critical part. So if the value is a string,
Skip it (no exception) and return null.
*/
if (in.peek() == JsonToken.STRING) {
in.skipValue();
return null;
}
return defaultAdapter.read(in);
}
}
}
最后,为 : *
Gson gson = new GsonBuilder() .registerTypeAdapterFactory(new MyResultObjectAdapterFactory())
.create();
现在,当使用该 Gson 对象反序列化 。 * __
我希望这可以解决您的问题=)
以上是 GSON忽略类型错误的元素 的全部内容, 来源链接: utcz.com/qa/410529.html