gson-typeadapter

最近のプロジェクトで問題が発生しました。つまり、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 <?>

おすすめ

転載: blog.csdn.net/Ser_Bad/article/details/64246499