2017-10-15 91 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對象。再次感謝您的回答。 –