2017-07-05 67 views
0

我正在使用Spring RestTemplate與提供JSON的提供的REST服務進行通信。要映射我使用Jaxon的響應,但我會很樂意切換到其他任何可行的方法。將JSON字符串匹配到新的POJO對象

我想創建一個POJO,其中包含交付數據的子內容,但在不同的結構中。

它歸結爲:

來源:{ "a": "val_a", "b" : {"c" : "val_c", "d": "val_d"}}

@JsonIgnoreProperties(ignoreUnknown = true) 
class Foo { 
    // should contains the content of `"a": "val_a"` 
    // but contains null 
    private Baa; 

    // getter and setter 
} 

@JsonIgnoreProperties(ignoreUnknown = true) 
class Baa { 
    private String a; 

    // getter and setter 
} 


// This should be the operation that is done internally by Spring when calling 
// ResponseEntity<Foo>response = restTemplate.exchange(url, HttpMethod.GET, entity, Foo.class); 
// response.getBody(); 
private Foo read(String s) { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.setSerializationInclusion(Include.NON_NULL); 
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 

    return mapper.readValue(s, Foo.class); 
}  

反序列化的結果是一個空巴阿對象。實際的JSON和POJO對象結構更復雜,但總結起來。

任何實現此目的的技術都會受到歡迎。 我提出的唯一可能性是在提供的結構中反序列化JSON並編寫一個生成所需對象的Converter類,但我希望避免這種情況。

-----更新/說明------ 問題是,屬性a應該映射到類Baa中,該屬性位於Foo內,但在根路徑中提供(這是正確的)提供的JSON對象

+0

我使用傑克遜和使用ObjectMapper - 通常我發現寫對象更容易,然後生成輸出的json。調整並重復 –

+0

我會推薦使用gson。 –

回答

1
public class Foo { 

    private String a; 
    private B b; 

    // getters setters 

} 

public class B { 

    private String c; 
    private String d; 

    // getters setters 

} 

應該映射,沒有額外的註釋與您的代碼。如果你有一個不平凡的例子的特定代碼,然後發佈你的實際代碼。

更新你的說明:不,你不能用註釋做這件事,就像我在評論中說的那樣。您將不得不編寫自定義反序列化器。看看這個答案:Jackson: is it possible to include property of parent object into nested object?

+0

這反序列化提供的JSON,但我想映射類B中的字符串a而不需要轉換器類 – Aracos

+0

如果配置正確,Jackson將自動執行此操作。一定要給「Baa」分配一個變量名,並且擁有正確的getter和setter。另外,您可以使用Jackson的ObjectMapper反序列化。 – Nico

+0

@Aracos不,你不能用註釋做到這一點。您將需要一個自定義的反序列化器:https:// stackoverflow。COM /問題/ 19191223 /傑克遜-是-IT-可能對包括屬性-的父對象 - 進入 - 嵌套對象 – Strelok

0

如果你不想編寫提交JSON結構的java bean,你必須使用一個不同的庫。傑克遜迫使你創建一個反映JSON結構的Java結構。在我看來,傑克遜的工作很棒,我建議你使用它,但替代品可能是JSON庫。

有了這個,你只能從json中選擇你想要的元素,並將它映射到你想要的bean。

小例如:

JSONObject response = new JSONObject("{\"a\": \"val_a\", \"b\" : {\"c\" : \"val_c\", \"d\": \"val_d\"}}"); 

JSONObject bObject = response.getJSONObject("b"); 
String cElement = (String) elenco.get("c"); 

bObject{"d":"val_d","c":"val_c"},和cElement的值的值是val_c

這libray使用JSONObjectJSONArray通用對象,到的內容映射JSON到一個Java對象。