2016-01-20 22 views
2

假設我有以下JSON數據:傑克遜反序列化包含有效的JSON字符串值

{ 
    "header": "some value", 
    "message": "{\"field1\": \"abc\", \"field2\": 123}" 
} 

是否有可能在調整的在OuterClass註解所以message場會被解析爲一個對象將InnerClass?

public class InnerClass { 
    @JsonProperty("field1") 
    public void setField1(String value) {/* do stuff */} 

    @JsonProperty("field2") 
    public void setField2(Integer value) {/* do stuff */} 
} 

public class OuterClass { 
    @JsonProperty("message") 
    public void setMessage(InnerClass obj) {/* do stuff */} 
} 

理想我想調用代碼看起來是這樣的:

ObjectMapper mapper = new ObjectMapper(); 
OuterClass obj = mapper.readValue(jsonStr, OuterClass.class); 
+0

我想是這樣,傑克遜是非常靈活。但是我沒有我在這裏工作過的代碼,看看你能否在我的這兩個問題中找到有用的東西:[first](http://stackoverflow.com/q/33408640/3127111)和[second ](http://stackoverflow.com/q/33519354/3127111) – watery

+0

我會研究它們。謝謝 –

回答

3

結構的外部類有表示嵌套的JSON,像其他類的屬性:

public class OuterClass { 

    @JsonProperty("header") 
    private String header; 

    @JsonProperty("message") 
    private InnerClass message; 

    //getters & setters 
} 
+0

我設法讓這種方法奏效。但是,我不得不創建一個接受值的構造函數。它不會使用默認的構造函數,然後調用setter。錯誤:'不能從JSON字符串實例化[simple type,InnerClass]類型的值; 沒有單個字符串構造函數/工廠方法(通過引用鏈:InnerClass)' –

0

一旦我增加了一些複雜性,接受的答案是行不通的。我一直得到錯誤:

Can not instantiate value of type [simple type, InnerClass] from JSON String; no single-String constructor/factory method (through reference chain: InnerClass)

我結束了使用以下方法

public class OuterClass { 
    public InnerClass message; 

    @JsonCreator 
    public OuterClass (Map<String,Object> delegate) throws IOException { 
     String json = (String)delegate.get("Message"); 
     ObjectMapper mapper = new ObjectMapper(); 
     this.message = mapper.readValue(json, InnerClass.class); 
    } 
}