【问题标题】:Accessing json property twice访问 json 属性两次
【发布时间】:2017-10-15 10:54:33
【问题描述】:

考虑以下json 文档:

{
  "a": {
    "one": "1",
    "two": "2"
  },
  "b": {
    "three": "3",
    "four": "4",
  }
}

我需要将其反序列化为以下 POJO:

class Root{

 @JsonAlias({"a","b"})
 Node1 node1;

 @JsonAlias({"a","b"})
 Node2 node2;
}

class Node1 {
 String one;
 String three;
}
class Node2 {
 String two;
 String four;
}

看起来嵌套节点(ab)在 mapper.readValue 期间只能遍历一次。如果我从 node2 中删除 @JsonAlias({"a","b"}),则 Jackson 仅填充 node1,如果我从 node1 中删除 @JsonAlias({"a","b"}),则仅填充 node2

如果我在两者上都保留注释,则只会填充其中一个。

是否支持此映射?如果不是,应该是什么解决方法?

我正在使用杰克逊 2.9.1

【问题讨论】:

    标签: json jackson jackson2 jackson-databind


    【解决方案1】:

    @JsonAlias 仅适用于直接带注释的字段,在您的情况下为 node1node2。它不会导致 Jackson 在 Node1Node2 类中查找字段。例如,在解析 Node1 类的对象时,无论使用的别名如何,它都会期望字段 onethree 并且找不到两者。我推荐这组注释:

    class Root {
        @JsonAlias("a")
        Node1 node1;
    
        @JsonAlias("b")
        Node2 node2;
    }
    
    class Node1 {
        String one;
    
        @JsonAlias("two")
        String three;
    }
    
    class Node2 {
        @JsonAlias("three")
        String two;
    
        String four;
    }
    

    然后您可以解析您问题中的 JSON 文档。

    【讨论】:

    • 谢谢@manos-nikolaidis,但我的用例比我描述的要复杂。我最终在中间进行了jolt 转换,然后用杰克逊将转换后的对象读入 Root 对象。再次感谢您的回答。
    猜你喜欢
    • 2016-10-11
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多