2015-06-12 82 views
2

我想解析一些從Web API到Java對象的JSON,並有一些問題。解析與genson嵌套的JSON

這裏是JSON:

{ 
    "d":{ 
    "results":[ 
     { 
      "__metadata" { some metadata I'm not interested in }, 
      "attribute1":"attribute id 1", 
      "attribute2:"attribute value 1" 
     }, 
     { 
      "__metadata" { some metadata I'm not interested in }, 
      "attribute1":"attribute id 2", 
      "attribute2:"attribute value 2" 
     } 
     ] 
    } 
} 

現在我要地圖以下Java類這一數據,這樣的結果是一個目錄對象,結果數組中的值是CatalogEntry對象:

public class Catalog { 
    private final List<CatalogEntry> values; 

    public Catalog() { 
     values = null; 
    } 

    public Catalog(@JsonProperty("results") List<CatalogEntry> values) { 
     super(); 
     this.values = values; 
    } 
} 

public class CatalogEntry { 
    private String attribute1; 
    private String attribute2; 

    public CatalogEntry() {} 

    public CatalogEntry(@JsonProperty("attribute1") String attribute1, 
         @JsonProperty("attribute2") String attribute2) { 
    this.attribute1 = attribute1; 
    this.attribute2 = attribute2; 
    } 
} 

有以下行我試圖JSON字符串反序列化到一個目錄對象:

Catalog catalog = genson.deserialize(json, Catalog.class); 

之後,我嘗試獲取Catalog對象中的值,但得到NullPointerException,因爲它似乎是空的。我認爲反序列化對JSON中的「d」對象有問題,但我該如何解決這個問題?任何幫助,將不勝感激。

回答

0

問題是你有2個構造函數,一個沒有參數,另一個沒有參數。在這種情況下,Genson挑選空的構造函數。 而且由於屬性不可見並且沒有setter,所以它不會填充值。

所以,如果你想讓Genson使用特定的構造函數,那麼你必須用@JsonCreator對它進行註釋。

Genson genson = new GensonBuilder() 
    .useConstructorWithArguments(true) 
    .create(); 

的另一個選項是告訴Genson通過這樣做是爲了使用私有性質:BTW,你可以,如果你配置Genson了這個選項的參數刪除JsonProperty(「...」)

Genson genson = new GensonBuilder() 
    .useFields(true, VisibilityFilter.PRIVATE) 
    .create(); 

在這種情況下,您不需要構造函數上的註釋,因爲Genson將使用no arg one。我向你推薦第一個選項。

+0

感謝您的回答,目前無法嘗試您的提示,但明天當我回來工作時。 –

+0

嘿,我通過指定正確的構造函數來嘗試你的tps,但是目錄的值還沒有創建。 –

+0

哦,我看到你的目錄對象不是json的根。你可以改變你的JSON沒有d:{results}而只是{results}?否則,如果所有傳入的jsons都將使用d作爲密鑰,則可以使用[wrapRootValues(「d」,「d」)]配置Genson(http://owlike.github.io/genson/Documentation/Configuration/) – eugen