2014-04-23 47 views
0

反序列化複雜的Json我遇到了一個問題,用「複雜」 JSON:與傑克遜

{ 
    "Books": [ 
    { 
     "title": "Java", 
     "instructions": [], 
     "links": { 
     "EJB": { 
      "href": "www.java.com/EJB" 
     } 
     } 
    }, 
    { 
     "title": "C#", 
     "instructions": [], 
     "links": { 
     "SOAP": { 
      "href": "www.C#.com/SOAP" 
     } 
     } 
    }] 
} 

誰能告訴我如何反序列化這種JSON來獲得POJO的名單嗎?

該POJO必須是一個「書」有3個字段:標題,說明和鏈接

謝謝。

+0

你的意思是有一個JSON數組? –

+0

@SotiriosDelimanolis抱歉忘了說我想要一個POJO。 –

回答

0

POJO類看起來是這樣的:

class Books { 

    @JsonProperty("Books") 
    private List<Book> books; 

    public List<Book> getBooks() { 
     return books; 
    } 

    public void setBooks(List<Book> books) { 
     this.books = books; 
    } 

    @Override 
    public String toString() { 
     return "Books [books=" + books + "]"; 
    } 
} 

class Book { 

    private String title; 
    private List<String> instructions; 
    private Map<String, Link> links; 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public List<String> getInstructions() { 
     return instructions; 
    } 

    public void setInstructions(List<String> instructions) { 
     this.instructions = instructions; 
    } 

    public Map<String, Link> getLinks() { 
     return links; 
    } 

    public void setLinks(Map<String, Link> links) { 
     this.links = links; 
    } 

    @Override 
    public String toString() { 
     return "Book [title=" + title + ", instructions=" + instructions + ", links=" + links + "]"; 
    } 
} 

class Link { 

    private String href; 

    public String getHref() { 
     return href; 
    } 

    public void setHref(String href) { 
     this.href = href; 
    } 

    @Override 
    public String toString() { 
     return href; 
    } 
} 

簡單的用法:

ObjectMapper mapper = new ObjectMapper(); 

System.out.println(mapper.readValue(json, Books.class)); 

上面的程序打印:

Books [books=[Book [title=Java, instructions=[], links={EJB=www.java.com/EJB}], Book [title=C#, instructions=[], links={SOAP=www.C#.com/SOAP}]]] 
+0

非常感謝它工作正常^^ –

1

對於初學者來說,你的JSON有一個基本問題;你有重複的成員名稱。

而在這種情況下,解析器的行爲是undefinedRFC 7159, section 4)。由於jsonschema2pojo使用傑克遜,這意味着您將獲得每個重複成員的定義值最後

使用數組:

[ 
{ 
    "title":"Title 1", 
    "instructions" : [], 
    "links": { 
    "link 1": { 
     "href": "The link 1" 
    } 
    } 
}, 
{ 
    "title":"Title 2", 
    "instructions" : [], 
    "links": { 
    "link 2": { 
     "href": "The link 2" 
    } 
    } 
} 
] 

然後,jsonschema2pojo不會真的反序列化到一個POJO;你真正想要的是定義MyClass類的數組元素(即一個對象),並使用傑克遜的ObjectMapper反序列化:

final TypeReference<List<MyClass>> typeref 
    = new TypeReference<List<MyClass>>() {}; 

final ObjectMapper mapper = new ObjectMapper(); 

final List<MyClass> list = mapper.readValue(whatever, typeref); 
+0

+1 - 你的回答遠比我的好:) – Mena

+0

謝謝你的回答,我也使用了和你一樣的java代碼。我遇到了一個異常:無法識別的字段鏈接1或無論爲​​瞭解決這個問題,我必須創建一個名爲「鏈接1」或「鏈接2」等類,我真的不想這樣做。 –

+0

@CarriedLouis然後你需要適應你的POJO - 不能真的幫助這裏,因爲我不知道你想用它做什麼 – fge