[英]Root element in JSON is coming twice
我在JSON中獲得了兩倍的根元素。
這是我的模型:
@JsonRootName(value="volumes")
@XmlRootElement(name = "volumes")
public class VolumeDetails {
@XmlElement(name = "volume")
private List<VolumeDetail> volume;
public List<VolumeDetail> getVolumes() {
if (volume == null) {
volume = new ArrayList<VolumeDetail>();
}
return volume;
}
}
我正在使用傑克遜對象映射器,如:
ObjectMapper om = new ObjectMapper().enable(SerializationConfig.Feature.WRAP_ROOT_VALUE);
try {
String jsonResponse = om.writeValueAsString(volumeDetails);
return Response.ok().entity(jsonResponse).build();
}
O / P:
{
"volumes":{
"volumes":[
{
"status":"available",
"id":"vol-1"
},
{
"status":"unavailable",
"id":"vol-2"
}
]
}
}
預期O / P:
{
"volumes":[
{
"status":"available",
"id":"vol-1"
},
{
"status":"unavailable",
"id":"vol-2"
}
]
}
卷標簽是我不想的兩倍,有沒有辦法抑制它。 如果我刪除@JsonRootName批注和序列化功能,我將獲取“ volume”而不是“ volumes”,即@xmlElement(name =“ volume”),我的輸出如下所示:
{
"volume":[
{
"status":"available",
"id":"vol-1"
},
{
"status":"unavailable",
"id":"vol-2"
}
]
}
從SerializationFeature.WRAP_ROOT_VALUE
文檔中:
可以啟用以使根值(通常為JSON對象,但可以是任何類型)包裝在單個屬性JSON對象中的功能,其中鍵為“根名”,由注釋內省者確定(對於使用@XmlRootElement的JAXB尤其如此) .name)或后備廣告(非合格的類名)。 功能主要是為了與JAXB兼容。
默認情況下禁用此功能。
以及@JsonRootName
文檔:
與XmlRootElement相似的注釋,用於指示用於根級包裝的名稱(如果啟用包裝)。 注釋本身並不表示應使用包裝; 但是,如果是,則用於序列化的名稱應為此處指定的名稱,反序列化器也應使用該名稱。
因此,考慮以下示例:
<!-- an old version of jackson which contains "SerializationConfig.Feature" -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.map.annotate.JsonRootName;
@JsonRootName(value = "volumes")
@XmlRootElement(name = "volumes")
public class VolumeDetails {
@XmlElement(name = "volume")
private List<VolumeDetail> volume;
public List<VolumeDetail> getVolumes() {
if (volume == null) {
volume = new ArrayList<>();
}
return volume;
}
}
public class VolumeDetail {
private String id;
private String status;
// getters and setters
}
public static void main(final String[] args) throws Exception {
final VolumeDetails volumeDetails = new VolumeDetails();
final VolumeDetail v1 = new VolumeDetail();
v1.setId("vol-1");
v1.setStatus("available");
volumeDetails.getVolumes().add(v1);
final VolumeDetail v2 = new VolumeDetail();
v2.setId("vol-2");
v2.setStatus("unavailable");
volumeDetails.getVolumes().add(v2);
final ObjectMapper om = new ObjectMapper();// .enable(SerializationConfig.Feature.WRAP_ROOT_VALUE);
final String jsonResponse = om.writeValueAsString(volumeDetails);
System.out.println(jsonResponse);
}
將產生這樣的JSON:
{
"volumes":[
{
"id":"vol-1",
"status":"available"
},
{
"id":"vol-1",
"status":"unavailable"
}
]
}
您可以僅從ObjectMapper
禁用SerializationFeature.WRAP_ROOT_VALUE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.