2013-08-15 2 views
0

Я планирую сериализовать список объектов JAXB для ответа JSON. Ниже приведен формат, который я получаю. В нижеприведенном ответе я вижу еще один объект между «systemInfoList», который фактически показывает массив. Вместо этого я хочу, чтобы depend_systems_infos должен показывать массив []. Также, если есть один системный информационный ответ, он все равно должен отображаться в формате массива. Я использую парсер Jackson, cxf.Настроить сериализацию списка объектов JAXB для JSON?

Формат в настоящее время я получаю:

{ 
    "dependent_systems_infos":{ 
     "systemInfoList":[ 
      { 
      "system_name":"PZ_Service", 
      "system_type":"Internal", 
      "service_infos":[ 
       { 
        "service_name":"getPZAttributes", 
        "status":"DOWN", 
        "response_time_ms":50 
       } 
      ] 
     }, 
     { 
      "system_name":"OMS", 
      "system_type":"External", 
      "service_infos":[ 
       { 
        "service_name":"CreateOrder", 
        "status":"UP", 
        "response_time_ms":2000 
       }, 
       { 
        "service_name":"CancelOrder", 
        "status":"UP", 
        "response_time_ms":500 
       } 
      ] 
     } 
     ] 
    } 
} 

Формат Мне нужно:

{ 
    dependent_system_infos : [ 
     { 
     system_name : 'OMS' 
     system_type: 'External' 
     services_infos: [ 
        { 
        service_name : 'CreateOrder' 
         status : 'UP' 
        response_time_ms : 2000 
       }, 
      { 
       service_name : 'CancelOrder' 
         status : 'UP' 
        response_time_ms : 2000 
      } 
     ] 
     }, 
     { 
     system_name : 'PZ_Service' 
     system_type: 'Internal' 
     services_infos: [ 
        { 
        service_name : 'getPZAttributes' 
         status : 'UP' 
        response_time_ms : 2000 
       } 
     ] 
     } 
    ] 
} 

классы JAXB я писал:

@XmlRootElement(name = "dependent_systems_infos") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ItineraryStatusResponse { 

    private List<SystemInfo> systemInfoList; 

    @XmlList 
    public List<SystemInfo> getSystemInfoList() { 
     return systemInfoList; 
    } 

    public void setSystemInfoList(List<SystemInfo> systemInfoList) { 
     this.systemInfoList = systemInfoList; 
    } 

} 

@XmlType(propOrder = { 
     "systemName", 
     "systemType", 
     "serviceInfoList" 
}) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class SystemInfo { 

    @XmlElement(name = "system_name", required = true) 
    protected SystemName systemName; 

    @XmlElement(name = "system_type", required = true) 
    protected SystemType systemType; 

    @XmlElement(name = "service_infos", required = true) 
    protected List<ServiceInfo> serviceInfoList; 

} 

ответ

0

Это помогло бы знать, как вы генерируете выход, но главная проблема в том, что вы сериализуете корневой объект, который содержит список, когда вы действительно хотите сериализовать сам список. Что бы вы ожидали от выведенного списка, если у ItineraryStatusResponse были другие поля?

Вы можете удалить @XmlRootElement аннотации и пометить список как элемент под названием «dependent_systems_infos»:

@XmlAccessorType(XmlAccessType.FIELD) 
public static class ItineraryStatusResponse { 

    private List<SystemInfo> systemInfoList; 

    @XmlElement(name = "dependent_systems_infos", required = true) 
    public List<SystemInfo> getSystemInfoList() { 
    return systemInfoList; 
    } 

    public void setSystemInfoList(List<SystemInfo> systemInfoList) { 
    this.systemInfoList = systemInfoList; 
    } 
} 

Если вы делаете сериализациям себя, другой подход был бы уронить ItineraryStatusResponse объект целиком (так как это просто обертка в списке), а затем сериализации самого списка с SerializationFeature.WRAP_ROOT_VALUE = true и корневым именем вы предоставляете:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); 

AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); 
mapper.setAnnotationIntrospector(introspector); 

ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter().withRootName("dependent_systems_infos"); 
System.out.println(writer.writeValueAsString(systemInfoList)); 

Оба эти подхода обеспечивают желаемый результат в моем тестирование с помощью Jackson 2.2.

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