2012-05-31 53 views
1

JSON響應JAXB JSON傑克遜解組陣列/單列表

例1:只有一個元素存在

{ 
"Person": { 
    "first": "foo", 
    "last": "bar" 
} 
} 

情況2:一個以上的元素的情況下(即,)適當的陣列型

{ 
"Person": [ 
    { 
     "first": "foo", 
     "last": "bar" 
    }, 
    { 
     "first": "cow", 
     "last": "pal" 
    } 
] 
} 

JAXB代碼生成上面的響應,我沒有一個控制。

@XmlRootElement 
public class PersonContainer { 

@XmlElement 
List<Person> personList; 
} 

我使用Jackson解析器的JAXB功能將JSON解組爲JAXB對象。由於有兩種類型的響應是可能的,因此Jackson案例1響應中的Jackson解析器無法正常工作。

如何正確處理兩種情況並綁定JSON響應?

回答

1

它看起來像一些自定義的編碼是必要的上述情況

有圖有以下

  @JsonDeserialize(using=PersonSerializer.class) 
      List<Person> personList; 

列表實現PersonSearializer

  public class PersonSerializer extends JsonDeserializer<List<Person>>{ 

public List<Person> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
    throws IOException, JsonProcessingException { 
    ObjectCodec oc = jsonParser.getCodec(); 
    JsonNode node = oc.readTree(jsonParser); 
    Iterator<JsonNode> iterator = node.getElements(); 

    List<Person> list = new ArrayList<Person>(); 
    while (iterator.hasNext()){ 
     JsonNode j = iterator.next(); 
     Person nr = new Person(); 
     if (j.get("first") == null) { 
      nr.setFirstName(node.get("first").getTextValue())); 
      nr.setLastName(node.get("last").getTextValue())); 
      list.add(nr); 
      break; 
     } 
     nr.setFirstName(j.get("first").getTextValue())); 
     nr.setLastName(j.get("last").getTextValue())); 
     list.add(nr); 
    } 

    return list; 
} 

}

1

我找到了解決方案:用更好的行爲替換JAXB JSON序列化程序像Jackson這樣的JSON序列化器。簡單的方法是使用jackson-jaxrs,它已經爲你做好了。這個類是JacksonJsonProvider。您只需編輯項目的web.xml,以便Jersey(或另一個JAX-RS實現)進行掃描。以下是您需要添加的內容:

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>your.project.packages;org.codehaus.jackson.jaxrs</param-value> 
</init-param> 

這就是它的全部。 Jackson將用於JSON序列化,並且它按照您對列表和數組的期望方式工作。

它適用於我,請確保jackson-jaxrs.jar在您的課程路徑中。

參考: How can I customize serialization of a list of JAXB objects to JSON?