JSON中的根元素来了两次

时间:2015-04-10 13:59:57

标签: json jaxb jackson

我在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"
         }
      ]
}

1 个答案:

答案 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