使用 GSON 在 JSON 到对象期间拦截值

dka*_*azi 1 android gson

我有以下设置:

public static class MyPojoImpl {
    @SerializedName("myNumber")
    private int myNumber;
    @SerializedName("myType")
    private String myType;

    @Override
    public List<String> getMyNumber() {
        return myNumber;
    }

    @Override
    public @Type String getMyType() {
        return myType;
    }

    @StringDef({Type.ONE,
            Type.TWO,
            Type.THREE})
    @Retention(RetentionPolicy.SOURCE)
    @interface Type {
        String ONE = "ONE";
        String TWO = "TWO";
        String THREE = "THREE";
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个myType来自 JSON的字符串值。我想将此字符串值限制为某些值。myType在设置为我的对象之前有什么方法可以拦截吗?

我知道我可以通过转换为type枚举来实现这一点,但我想完全避免使用枚举。或者,我也可以将检查逻辑放在 getter 中,但这不是太有效。

Jackson 允许使用 setter。GSON中有类似的东西吗?

Vin*_*dar 5

是的,您可以通过实施来自定义反序列化过程 JsonDeserializer

完整示例请参考此处

private class DateTimeDeserializer implements JsonDeserializer<MyPojoImpl> {
  public MyPojoImpl deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {
        MyPojoImpl pojoImpl = new MyPojoImpl();
        // Do the Processing here
        return pojoImpl
  }
}

GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(MyPojoImpl.class, new DateTimeDeserializer());
Run Code Online (Sandbox Code Playgroud)