从json反序列化org.springframework.data.util.pair

时间:2018-10-29 15:22:09

标签: java json spring spring-boot jackson

我应该能够将org.springframework.data.util.pair序列化/反序列化为JSON /从JSON。

我有List<Pair<A, B>> myPairList-我要存储/加载此列表。

序列化是没有问题的;但是,由于此pair是不可变的,因此没有默认的构造函数,反序列化也会失败。
我知道这里有@JsonCreator;但是如果我正确的话,我们只能将其放在构造函数上。由于pair类是最终类,因此无法使用带有@JsonCreator注释的自己的默认构造函数对其进行扩展。
有人可以指出我,我怎样才能实现自己的目标?我想避免创建自己的包装器类。

2 个答案:

答案 0 :(得分:1)

我认为您需要为该属性实现自定义反序列化器,例如此答案https://stackoverflow.com/a/19167145/1905015。您可以在属性上方放置@JsonDeserialize注释。

答案 1 :(得分:0)

markusw的答案是正确的。为了显示一个真实的例子,这是我最后解决它的方法,以反序列化对列表:

public class MyPairDeserializer extends JsonDeserializer<Pair<MyClassA, MyClassB>> {

  static private ObjectMapper objectMapper = null;

  @Override
  public Pair<MyClassA, MyClassB> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    if (objectMapper == null) {
      objectMapper = new ObjectMapper();
      objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
    JsonNode treeNode = jsonParser.getCodec().readTree(jsonParser);
    MyClassA first = objectMapper.treeToValue(treeNode.get("first"), MyClassA.class);
    MyClassB second = objectMapper.treeToValue(treeNode.get("second"), MyClassB.class);
    return Pair.of(first, second);
  }

}

...
SimpleModule module = new SimpleModule();
module.addDeserializer(Pair.class, new MyPairDeserializer());
objectMapper.registerModule(module);
List<Pair<MyClassA, MyClassB>> myData = objectMapper.readValue(file..., new TypeReference<List<Pair<Class<MyClassA>, Class<MyClassB>>>>() {
...

请注意反序列化器中嵌入的ObjectMapper。用于反序列化配对中的“第一”和“第二”。