![](/img/trans.png)
[英]JAX-RS/Jackson — Deserialize JSON with Unknown Root Element Name?
[英]Jersey Jackson root name coming as ArrayList
我有一個對象數組列表。 數組列表。 Employee類使用@XMLRootElement(name =“ employees”)進行注釋。 我使用球衣1.8.1,傑克遜1.9.2和POJOMappingFeature。響應就像
{
ArrayList: [{name: John, age: 28}, {name: Mike, age:29}]
}
我如何讓傑克遜在json響應中顯示正確的根名稱(員工)。 我也嘗試在Employee類上使用@JsonName(value =“ employees”)。 我需要不使用帶有屬性List的EmployeeListWrapper之類的列表包裝器來執行此操作。 我想得到這樣的回應
{
employees: [{name: John, age: 28}, {name: Mike, age:29}]
}
是否可以使用任何傑克遜對象映射器配置來執行此操作。 任何幫助將不勝感激。
您可能無法使用@XMLRootElement
或@JsonRootName
批注實現此目的,因為批注必須放在ArrayList
類本身上。 並且由於您需要在沒有任何集合包裝的情況下進行操作,因此您將不得不直接使用Jackson ObjectMapper
。
映射器提供對ObjectWriter
構建器的訪問,
可以用於序列化參數(例如JSON View和要使用的根類型)的按序列化配置的Builder對象。
並且作者具有您需要的withRootName()
方法。
用配置構造新實例的方法,該配置指定用於“根元素包裝”的根名稱。
請參見下面的代碼段。
ObjectWriter writer = ObjectMapper.writer().withRootName("employees");
writer.writeValueAsString(employees);
默認情況下,Jackson可能無法識別JAXB批注,但是您可以自定義對象映射器來執行此操作。
如果要堅持使用Jackson批注,則可以使用@JsonRootName指示用於根級包裝的名稱。
另一種選擇是在重寫方法findRootName() JaxbAnnotationIntrospector並使用該內部ObjectMapper。
因此代碼如下所示:
@Override
public String findRootName(AnnotatedClass ac) {
// will return "employees" for @XmlType(name = "employees")
// Or you can return the class name itself
return ac.getAnnotations().get(XmlType.class).name();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.