是否有可能 gson 将 JsonArray 自动映射到 POJO

Is it possible to gson auto-map a JsonArray into a POJO

我有一个包含 4 个字段的 pojo 需要填写。这些值来自对象的 JsonArray(嵌套在更大的 JSON 对象中),其中包含许多元素,例如 -

                           "res":[
                                    {"id":"irrelevant","val":"0"},
                                    {"id":"irrelevant","val":"N"},
                                    {"id":"irrelevant","val":"NO_THEFT"},
                                    {"id":"first_needed_field","val":"0"},
                                    {"id":"irrelevant","val":"N"},
                                    {"id":"second_needed_field","val":"33342"},
                                    etc etc etc
                                 ]

是否可以使用 gson.fromJson() 方法自动映射此 JsonArray?

我使用@SerializedName 注释来映射 Pojo 字段以匹配 id,但我一直无法弄清楚如何将数组转换为对象。 None 我的尝试成功了,虽然我在这里发现了许多其他 gson 问题和其他人有同样的错误,但我还没有发现任何人故意尝试我正在尝试的事情。

这有点含糊,但我想我知道你想做什么。提示是不要这样做。

请使用 Gson 库提供的序列化和反序列化。但只需遍历 List<> 并以常规方式填充对象。

是的,这是可能的,但是您将解释引入反射。正如您已经提到的,您正在映射一个更大的对象,我已经可以想象它产生的混乱代码。

您可以使用自定义 TypeAdapter

假设您有以下 Pojo:

public class YourPojoClass {
  private String firstNeededField;
  private String secondNeededField;
  // Getters and setters...
}

你应该在父 class:

中像这样声明字段 res
public class YourParentClass {
  private YourPojoClass res;
  // Getters and setters...
}

然后你必须像这样实现你的自定义TypeAdapter

public class YourCustomTypeAdapter extends TypeAdapter<YourPojoClass> {
  @Override
  public YourPojoClass read(JsonReader in) throws IOException {
    YourPojoClass result = new YourPojoClass();
    Gson gson = new Gson();
    in.beginArray();
    while(in.hasNext()) {
      IdAndVal entry = gson.fromJson(in, IdAndVal.class);
      if (entry.getId() != null) {
        switch (entry.getId()) {
          case "first_needed_field":
            result.setFirstNeededField(entry.getVal());
            break;
          case "second_needed_field":
            result.setSecondNeededField(entry.getVal());
            break;
          default:
            break;
        }
      }
    }
    in.endArray();
    return result;
  }

  @Override
  public void write(JsonWriter out, YourPojoClass value) throws IOException {
    throw new UnsupportedOperationException("Not implemented");
  }

  private static class IdAndVal {
    private String id;
    private String val;

    public String getId() { return this.id; }
    public void setId(String id) { this.id = id; }

    public String getVal() { return this.val; }
    public void setVal(String val) { this.val = val; }
  }
}

您现在要做的就是使用 GsonBuilder 注册此 TypeAdapter 以使用它:

Gson gson = new GsonBuilder()
  .registerTypeAdapter(YourPojoClass.class, new YourCustomTypeAdapter())
  .create();

你应该可以开始了。