我在JSON中获得两次root元素。
这是我的模特:
@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;
}
}
我使用的是jackson对象映射器:
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注释和序列化功能,我得到“卷”而不是“卷”,这是@xmlElement(name =“volume”),我的输出如下:
{
"volume":[
{
"status":"available",
"id":"vol-1"
},
{
"status":"unavailable",
"id":"vol-2"
}
]
}
答案 0 :(得分:0)
来自SerializationFeature.WRAP_ROOT_VALUE
文档:
可以启用以在单个属性JSON对象中包含的根值(通常是JSON对象但可以是任何类型)的功能,其中key作为&#34;根名称&#34;,由注释introspector确定(尤其适用于使用@ XmlRootElement.name)或后备(非限定类名)的JAXB。功能主要用于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"
}
]
}
您只需从SerializationFeature.WRAP_ROOT_VALUE
停用ObjectMapper
。