最近のプロジェクトで問題が発生しました。つまり、Gsonが空の配列を解析するときに、背景を無視してこの問題を適切に解決するとどうなるでしょうか。答えは-Gsonのシリアル化と逆シリアル化:
public class ResultDeserializer implements JsonDeserializer<BaseResult> {
@Override
public BaseResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
//下面添加你要做的事情
if (obj.get("result") != null) {
if (obj.get("result").isJsonObject() && obj.getAsJsonObject("result").has("message") && obj.getAsJsonObject("result").entrySet().size() == 1) {
obj.getAsJsonObject("result").remove("message");
}
if (obj.get("result").toString().equals("{}")) {
obj.remove("result");
}
}
BaseResult baseResult = new Gson().fromJson(json, typeOfT);
if (obj.has("success")&&obj.get("success").getAsString().equals("true")) {
baseResult.setSuccess(true);
} else {
baseResult.setSuccess(false);
}
if (obj.isJsonNull()) {
baseResult.setSuccess(false);
}
baseResult.setErrorcode(obj.has("errorcode") ? obj.get("errorcode").getAsString() : "");
baseResult.setErrorcode(obj.has("error") ? obj.get("errorcode").getAsString() : "");
return baseResult;
}
}
次に、このタイプアダプターを登録します
Gson gson=new GsonBuilder()
.registerTypeAdapter(BaseResult.class, new ResultDeserializer())
.create();
それなら問題ありません。ジェネリックBeanの基本クラスを記述して、次のようにグローバルに使用できます。
public class BaseResult<T> implements Serializable {
private Boolean success;
private String errorcode;
private String error;
private T result;
}
registerTypeAdapter
また、さまざまなタイプをサポートしており、勉強する時間を見つけることができます。
- JsonSerializer <?>
- JsonDeserializer <?>
- InstanceCreator <?>
- TypeAdapter <?>