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

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

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

<organisation>
  <id>1</id>
  <name>XYZ</name>
  <facilities>
    <facility>
      <id>1</id>
      <text>Telephone</text>
    </facility>
    <facility>
      <id>3</id>
      <text>Whiteboard</text>
    </facility>
  </facilities>
  <locations>
    <location>
      <id>1</id>
      <kind>REGION</kind>
      <name>London</name>
    </location>
    <location>
      <id>2</id>
      <kind>REGION</kind>
      <name>Manchester</name>
    </location>
  </locations>
</organisation>

И как 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 (см. «Внешние возможности» ниже). Если я определю вложенный список какArrayList подкласс, тогда JSON кажется правильным, но не XML (см. «Внешние расположения» ниже).

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

Обратите внимание, что не существует XML-элемента, который оборачивает список «местоположений» (как это имеет место для «объектов»), а также, что e, ach location имеет множественное имя элемента.

<organisation>
  <id>1</id>
  <name>XYZ</name>
  <facilities>
    <facility>
      <id>1</id>
      <text>Telephone</text>
    </facility>
    <facility>
        <id>3</id>
        <text>Whiteboard</text>
    </facility>
  </facilities>
  <locations>
    <id>1</id>
    <kind>REGION</kind>
    <name>London</name>
  </locations>
  <locations>
    <id>2</id>
    <kind>REGION</kind>
    <name>Manchester</name>
  </locations>
</organisation>

Пример JSON, показывающий правильный список «местоположений», но не «объектов»

Обратите внимание, что список «средств» - это объект 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"
    }
  ]
}

Приведенные выше примеры создаются с использованием того же кода, просто меняя заголовок Accept HTTP, чтобы Джерси возвращал 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<ExternalFacility> list;
  ...
}

ExternalLocations.java

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

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)

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