2012-08-30 101 views
0

我無法將這部分JSON轉換爲POJO。我使用的是傑克遜的配置是這樣的:將JSON列表轉換爲POJO

protected ThreadLocal<ObjectMapper> jparser = new ThreadLocal<ObjectMapper>(); 

    public void receive(Object object) { 
    try { 
     if (object instanceof String && ((String)object).length() != 0) { 
      ObjectDefinition t = null ; 
      if (parserChoice==0) { 
       if (jparser.get()==null) { 
        jparser.set(new ObjectMapper()); 
       } 
       t = jparser.get().readValue((String)object, ObjectDefinition.class); 
      } 

      Object key = t.getKey(); 
      if (key == null) 
       return; 
      transaction.put(key,t); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

下面是需要變成一個POJO的JSON:

{ 
    "id":"exampleID1", 
    "entities":{ 
     "tags":[ 
     { 
      "text":"textexample1", 
      "indices":[ 
       2, 
       14 
      ] 
     }, 
     { 
      "text":"textexample2", 
      "indices":[ 
       31, 
       36 
      ] 
     }, 
     { 
      "text":"textexample3", 
      "indices":[ 
       37, 
       43 
      ] 
     } 
     ] 
} 

最後,這是我目前擁有的Java類:

protected Entities entities; 
@JsonIgnoreProperties(ignoreUnknown = true) 
protected class Entities { 
    public Entities() {} 
    protected Tags tags; 
    @JsonIgnoreProperties(ignoreUnknown = true) 
    protected class Tags { 
     public Tags() {} 

     protected String text; 

     public String getText() { 
      return text; 
     } 

     public void setText(String text) { 
      this.text = text; 
     } 
    }; 

    public Tags getTags() { 
     return tags; 
    } 
    public void setTags(Tags tags) { 
     this.tags = tags; 
    } 
}; 
//Getters & Setters ... 

我已經能夠將更簡單的對象轉換爲POJO,但列表讓我難倒了。

任何幫助表示讚賞。謝謝!

+1

http://stackoverflow.com/questions/9829403/deserialize-json-to-arraylistpojo-using-jackson – mre

回答

3

我認爲你的問題與你的類定​​義。看起來你希望Tags類包含來自Json的原始文本,Json是一個數組。我會做什麼,而不是:

protected Entities entities; 
@JsonIgnoreProperties(ignoreUnknown = true) 
protected class Entities { 
    public Entities() {} 
    @JsonDeserialize(contentAs=Tag.class) 
    protected List<Tag> tags; 

    @JsonIgnoreProperties(ignoreUnknown = true) 
    protected class Tag { 
     public Tag() {} 

     protected String text; 

     public String getText() { 
      return text; 
     } 

     public void setText(String text) { 
      this.text = text; 
     } 
    }; 

    public Tags getTags() { 
     return tags; 
    } 
    public void setTags(Tags tags) { 
     this.tags = tags; 
    } 
}; 

在這裏我用一個列表來表示JSON數組的字段標識,我告訴傑克遜反序列化列表,標籤類的內容。這是必需的,因爲Jackson沒有通用聲明的運行時信息。你會爲索引做同樣的事情,即有一個帶有JsonDeserialize註釋的字段List<Integer> indices

+0

這工作,謝謝! –

+0

另外,我必須使這兩個類都靜態才能使其正常工作。這是什麼讓我這樣:http://stackoverflow.com/questions/8526333/jackson-error-no-suitable-constructor –

+1

看起來不錯。請注意,其中一個註釋('@JsonDeserialize(contentAs =)')是多餘的:不會傷害,但不是必需的(因爲字段簽名具有所有信息)。 – StaxMan