JAXB для списков, которые должны быть возвращены естественным образом для JSON или XML

Я использую MOXy с Джерси для реализации RESTful API и хочу естественным образом возвращать списки для JSON и XML, что означает, что XML содержит тег элемента для всей коллекции, а также элементы коллекции, тогда как JSON содержит тег для только коллекция.

Например, я хочу вернутьорганизация» ресурс с вложенными списками объектов и мест. Как XML:


  1
  XYZ
  
    
      1
      Telephone
    
    
      3
      Whiteboard
    
  
  
    
      1
      REGION
      London
    
    
      2
      REGION
      Manchester
    
  

И как JSON:

{
  "id": 1,
  "name": "XYZ",
  "facilities": [
    {
      "id": 1,
      "text": "Telephone"
    },
    {
      "id": 3,
      "text": "Whiteboard"
    }
  ],
  "locations": [
    {
      "id": 1,
      "kind": "REGION",
      "name": "London"
    },
    {
      "id": 2,
      "kind": "REGION",
      "name": "Manchester"
    }
  ]
}

К сожалению я неКажется, что я могу получить кодовую базу, которая позволяет мне возвращать вывод, как этот, как для XML, так и для JSON. Если я использую класс для переноса вложенного списка, то XML выглядит правильно, но не JSON (см. «ExternalFacilities» ниже). Если я определю вложенный список какArrayList подкласс, то JSON кажется правильным, но не XML (см. «ExternalLocations» ниже).

Пример XMLобъекты» список правильный, но неместа»

Смотрите, что нет элемента XML, который переносит "места» список (как есть для "объекты»), а также то, что каждое местоположение имеет множественное имя элемента.


  1
  XYZ
  
    
      1
      Telephone
    
    
        3
        Whiteboard
    
  
  
    1
    REGION
    London
  
  
    2
    REGION
    Manchester
  

Образец JSON "места» список правильный, но необъекты»

Смотри чтообъекты» list - это объект JSON, содержащий массив JSON, тогда как я просто хочу массив JSON (с множественным именем элемента).

{
  "id": 1,
  "name": "XYZ",
  "facilities": {
    "facility": [
        {
            "id": 1,
            "text": "Telephone"
        },
        {
            "id": 3,
            "text": "Whiteboard"
        }
    ]
  },
  "locations": [
    {
      "id": 1,
      "kind": "REGION",
      "name": "London"
    },
    {
      "id": 2,
      "kind": "REGION",
      "name": "Manchester"
    }
  ]
}

Приведенные выше примеры создаются с использованием того же кода, просто меняя HTTP-заголовок Accept, чтобы Джерси возвращал JSON вместо XML. Вот выдержка из классов:

ExternalOrganisation.java

@XmlRootElement(name="organisation")
@XmlAccessorType(XmlAccessType.FIELD)
public class ExternalOrganisation {

   private String             name;
   private ExternalFacilities facilities;
   private ExternalLocations  locations;

   ...

}

ExternalFacilities.java

@XmlRootElement(name="facilities")
public class ExternalFacilities {
  @XmlElementRef
  private List list;
  ...
}

ExternalLocations.java

@XmlRootElement(name="locations")
public class ExternalLocations extends ArrayList {
  ...
}

ExternalFacility.java

@XmlRootElement(name="facility")
@XmlType(propOrder={"id", "uri", "kind", "text"})
public class ExternalFacility extends ExternalBase {
    // id inherited
    private String text;
    ....
}

ExternalLocation.java

@XmlRootElement(name="location")
@XmlType(propOrder={"id", "kind", "name"})
public class ExternalLocation extends ExternalBase {
    // id inherited
    @XmlElement private LocationKind kind;
    @XmlElement private String       name;
    ...
}

Кажется сначала похожим наэтот вопрос но я'Я не пытаюсь смешивать типы объектов в моих списках.

Ответы на вопрос(1)

Ваш ответ на вопрос