2015-04-10 5 views
0

Я получаю дважды корневой элемент в JSON.Корневой элемент в 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 аннотаций и сериализации функции я получаю «объем» вместо «томов», который является @xmlElement (имя = «объем»), и мой выход выглядит следующим образом:

{ 
     "volume":[ 
     { 
      "status":"available", 
      "id":"vol-1" 
     }, 
     { 
      "status":"unavailable", 
      "id":"vol-2" 
     } 
     ] 
} 

ответ

0

От SerializationFeature.WRAP_ROOT_VALUE документация:

Функция, которая может быть включена для внесения корневого значения (обычно объекта JSON, но может быть любого типа), завернутого в один объект JSON объекта, где ключ как «корневое имя», как определено интроспектором аннотации (например, для JAXB, который использует @ XmlRootElement.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" 
     } 
    ] 
} 

Вы можете просто отключить SerializationFeature.WRAP_ROOT_VALUE от ObjectMapper.

+0

Если я удалю @JsonRootName функции аннотации и сериализации, я получаю «объем» вместо «томов». Я добавил O/P выше. –

+0

@chandansingh Я обновляю ответ, взгляните. Позвольте мне теперь, если не работает. Если генерировать 'volume', посмотрите в' VolumeDetails', может быть, вы получите 'getVolume' вместо' getVolumes'. –

+0

Спасибо большое. !! Теперь его работа .. :) –

Смежные вопросы