【问题标题】:Is it possible to gson auto-map a JsonArray into a POJO是否可以将 gson 自动映射 JsonArray 到 POJO
【发布时间】:2021-07-29 19:39:10
【问题描述】:

我有一个需要填写 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,但我一直无法弄清楚如何将数组转换为对象。我的尝试都没有奏效,虽然我在这里发现了许多其他 gson 问题以及其他有相同错误的人,但我还没有找到任何人故意尝试我正在尝试的东西。

【问题讨论】:

  • 听起来可能。目前尚不清楚您的映射应该是什么样子,也不清楚应该如何映射像irrelevant 这样的多个键,不清楚为什么需要一个普通对象,您可以在其中将字符串映射到列表(又名 multimap ),目前尚不清楚您的尝试是什么,因此至少其他人可以看到您的想法。
  • 您能否提供inputmode 和必需的output 的示例?我想我知道你可以使用的库。

标签: java json gson


【解决方案1】:

这是相当模糊的,但我想我知道你想做什么。提示是不要这样做。

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

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

【讨论】:

    【解决方案2】:

    您可以使用自定义 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();
    

    你应该很高兴。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多