【问题标题】:Deserialize org.springframework.data.util.pair from json从 json 反序列化 org.springframework.data.util.pair
【发布时间】:2018-10-29 15:22:08
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为您需要为该属性实现自定义反序列化器:stackoverflow.com/a/19167145/1905015
  • 我编辑了问题以指出pair 不在另一个 POJO 中以进行序列化/反序列化。那么我应该在哪里/如何放置@JsonDeserialize
  • 好的,我可以将反序列化器添加到 ObjectMapper。但我需要找出如何正确检索字段...

标签: java json spring spring-boot jackson


【解决方案1】:

我认为您需要为该属性实现一个自定义反序列化器,就像在这个答案https://stackoverflow.com/a/19167145/1905015 中一样。您可以将@JsonDeserialize 注释放在属性上方。

【讨论】:

    【解决方案2】:

    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。用于反序列化 Pair 的“first”和“second”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多