簡體   English   中英

JSON中的根元素出現兩次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM