2012-09-27 59 views
0

我一直在使用jackson成功反序列化json對象和數組,但是這次我不能包裝我的頭以解決以下對象的反序列化問題。我怎麼能與傑克遜或任何其他JSON解析庫,反序列化:如何使用映射作爲其屬性反序列化json對象

[ 
    { 
     "name": "x", 
     "elements": { 
      "key1": { 
       "name": "a", 
       "type": "b" 
      }, 
      "key2": { 
       "name": "a", 
       "type": "b" 
      } 
     } 
    }, 
    { 
     "name": "y", 
     "elements": { 
      "key3": { 
       "name": "a", 
       "type": "b" 
      } 
     } 
    } 
] 

到一個列表,List<Test>,其中測試如下定義?

public class Test {  
    public class Element { 
     public String name; 
     public String type; 
     public String getName() { 
      return name; 
     } 
     public void setName(String name) { 
      this.name = name; 
     } 
     public String getType() { 
      return type; 
     } 
     public void setType(String type) { 
      this.type = type; 
     } 
    } 
    public String name; 
    public Map<String, Element> elements; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Map<String, Element> getElements() { 
     return elements; 
    } 
    public void setElements(Map<String, Element> elements) { 
     this.elements = elements; 
    } 
} 

最後,我反序列化代碼:

public List<Test> test(final InputStream inputStream) { 
    List<Test> test = null; 
    try { 
     test = mapper.readValue(inputStream, new TypeReference<List<Test>>() { }); 
    } catch (final IOException e) { 
     log.error("Unable to deserialize json",e); 
    } 
    return test; 
    } 

如果這是不可能的,什麼對象可以我其實反序列化JSON我到?我不能提前知道的一件事是鍵的名稱(例如鍵1,鍵2,鍵3)。

回答

1

它看起來像這樣:

ObjectMapper mapper = new ObjectMapper(); 
List<Test> tests = mapper.readValue(jsonInput, new TypeReference<List<Test>>() { }; 

會做到這一點。唯一棘手的部分是TypeReference,這是傳遞泛型類型信息所必需的。其他庫使用類似的方法(GSON有TypeToken等)。

+0

不幸的是,採用這種方法會返回一個空指針(不會產生異常)。如果我從我的json數組中刪除「元素」,那麼對於兩個條目(如預期的那樣),測試的正確大小爲兩個元素= null。 – Lolo

+0

多田!問題來自於Element是Test中的公共類。我在一個單獨的文件中創建了一個類Element,它工作。謝謝。我真的必須更好地理解這個TypeReference。 – Lolo

+0

啊。非靜態的內部類可能會有問題,因爲它們需要外部類的實例(「隱式父」這個'指針')。所以通常使用的內部類被定義爲'static'。 – StaxMan

相關問題