【问题标题】:Deserialize multiple objects with same attributes but different class name using ObjectMapper使用 ObjectMapper 反序列化具有相同属性但类名不同的多个对象
【发布时间】:2019-11-18 09:36:05
【问题描述】:

如何使用对象映射器反序列化具有相同结构但变量名不同的多个对象?

{ 
   "id":"A0D-29G3-03",
   "a":{ 
      "flag":"NORMAL",
      "date":"..."
   },
   "b":{ 
      "flag":"NORMAL",
      "date":"..."
   }
}

我将拥有比 A 和 B 更多的对象。这只是一个示例。如何反序列化具有相同结构但类名不同的多个对象(使用 ObjectMapper)?无需为每个班级创建一个 pojo .....

【问题讨论】:

标签: java json serialization jackson objectmapper


【解决方案1】:

...不同的类名

ab 不是不同的类名,是吗?它们是可以共享同一个类的不同字段。您可以对字段ab 等使用一个类(示例中为Abc)。

这对你有用吗?

    @Setter
    @Getter
    @ToString
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class AbcWrapper {
        private String id;
        @JsonAnySetter
        Map<String, Abc> abc = new LinkedHashMap<>();
    }

    @Setter
    @Getter
    @ToString
    public static class Abc {
        private String flag;
        private String date;
    }

    public static void main(String[] args) throws IOException {
        String json = "{ " +
                "   \"id\":\"A0D-29G3-03\"," +
                "   \"a\":{ " +
                "      \"flag\":\"NORMAL\"," +
                "      \"date\":\"...\"" +
                "   }," +
                "   \"a1\":{ " +
                "      \"flag\":\"NORMAL\"," +
                "      \"date\":\"...\"" +
                "   }," +
                "   \"a2\":{ " +
                "      \"flag\":\"NORMAL\"," +
                "      \"date\":\"...\"" +
                "   }," +
                "   \"a3\":{ " +
                "      \"flag\":\"NORMAL\"," +
                "      \"date\":\"...\"" +
                "   }," +
                "   \"b\":{ " +
                "      \"flag\":\"NORMAL\"," +
                "      \"date\":\"...\"" +
                "   }" +
                "}";


        ObjectMapper mapper = new ObjectMapper();
        final AbcWrapper abcWrapper = mapper.readValue(json.getBytes(), AbcWrapper.class);
        System.out.println(abcWrapper);
    }

我在示例中使用了 lombok 注释 @Setter@Getter@ToString。如果你不想使用 lombok,你可以用 setter/getter 替换它们。

【讨论】:

  • 如果您有数百个ab,您会怎么做?问题是关于那个案例
  • 是的,你是对的。这不是不同的类名,而是不同的变量名。就像 Vault23 评论的那样。如果我有很多ab 怎么办?我希望它是动态的
  • 你可以看看@JsonAnySetter。我已经修改了答案中的示例。
  • @ПетрАлександров 是的,你的答案是正确的,@JsonAnySetter 是在这里使用的好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多