gson 是否可以将JsonArray自动Map到POJO

nhaq1z21  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(163)

我有一个pojo,其中有4个字段需要填充。这些值来自一个对象的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()方法自动Map此JsonArray?
我使用了@SerializedName注解来MapPojo字段以匹配id,但是我一直无法弄清楚如何将数组转换为对象。我的尝试都没有成功,虽然我在这里发现了许多其他的gson问题,以及其他人有同样的错误,但我还没有发现有人故意尝试我正在尝试的东西。

zmeyuzjn

zmeyuzjn1#

这是相当模糊的,但我想我知道你想做什么。提示是不要做。
一定要使用Gson库提供的序列化和反序列化,但只需遍历List〈〉并以常规方式填充对象即可。
是的,这是可能的,但是你正在将 * 解释 * 引入 * 反射 *。正如你已经提到的,你正在Map一个更大的对象,我已经可以想象来自它的混乱代码。

4ktjp1zp

4ktjp1zp2#

您可以使用自订的TypeAdapter来执行此动作。
假设您有以下Pojo:

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

您应该在父类中如下声明字段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();

你应该可以走了。

相关问题