2017-10-15 82 views
1

考虑以下json文件:访问JSON属性两次

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

我需要把它deserizlize到下面的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期间仅被遍历一次。杰克逊只填写node1,如果我从node2删除@JsonAlias({"a","b"}),并且如果我从node1删除@JsonAlias({"a","b"}),则只删除node2

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

是否支持该映射?如果没有,解决方法是什么?

我使用的是杰克逊2.9.1

回答

1

@JsonAlias仅适用于注解的字段直接,你的情况node1node2。它不会导致杰克逊在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文档。

+0

谢谢,@ manos-nikolaidis,但我的用例比我描述的更复杂。我最终在中间转换[jolt](https://github.com/bazaarvoice/jolt),然后用jackson将转换后的对象读入Root对象。再次感谢您的回答。 –