JAXB - Джерси - JSON - Сериализация универсальных коллекций: - PullRequest
0 голосов
/ 28 марта 2012

У меня есть:

@XmlRootElement( name = "list" )
@XmlAccessorType(XmlAccessType.FIELD)
public class JaxbList<T>  implements Serializable{
    private static final long serialVersionUID = -7054818420430302896L;

    @XmlAnyElement
    private Collection<T> list;
}

и,

@XmlRootElement(name="payload")
public class Payload<T> implements Serializable {
    private static final long serialVersionUID = -2919689796111868862L;
    @XmlTransient
    private T data; 
}

и,

    @XmlRootElement (name="data")
    public class PayloadData<T> implements Serializable {

        @XmlTransient
        private T value;
        @XmlTransient
        private URI uri;

        public PayloadData() {}

        @XmlAnyElement (lax = true )
        @XmlMixed
        public T getValue() {
            return value;
        } ...
}

, которые я использую вот так:

@GET
public Response getWorkspaces(@Context UriInfo uriInfo) {
    JaxbList<PayloadData<WorkspaceInfo>> workspaces = new JaxbList<PayloadData<WorkspaceInfo>> ( new ArrayList<PayloadData<WorkspaceInfo>>( dbData) );
    return Response.ok().entity( new Payload( workspaces ) ).build();
}

Мой вывод JSON для конечной точки GET неверен.XML в порядке.Вывод XML:

<payload>
  <list>
    <data>
      <uri>http://localhost:8080/api/rest/v1/workspaces/1/items</uri>
      <data>
        <id>1</id>
        <category>Cat1</category>
        <label>WKS1</label>
      </data></data>
      <data>
        <uri>http://localhost:8080/api/rest/v1/workspaces/2/items</uri>
        <data>
          <id>2</id>
          <category>Cat2</category>
          <label>WKS2</label>
        </data>
      </data>
  </list>
</payload>

Неправильный JSON:

{
   "list":{
      "data":{
         "uri":"http://localhost:8080/api/rest/v1/workspaces/1/items.json",
         "data":{
            "id":1,
            "category":"Cat1",
            "label":"WKS1"
         }
      },
      "data":{
         "uri":"http://localhost:8080/api/rest/v1/workspaces/2/items.json",
         "data":{
            "id":2,
            "category":"Cat2",
            "label":"WKS2"
         }
      }
   }
}

Вы можете видеть, что вместо создания массива JSON элемент данных представляет собой просто серию объектов стот же ключ "data", а не массив json, заключенный в [] .То есть, один возможный ожидаемый вывод JSON:

{
   "list":[
      {"data":{
         "uri":"http://localhost:8080/api/rest/v1/workspaces/1/items.json",
         "data":{
            "id":1,
            "category":"Cat1",
            "label":"WKS1"
         }
       }
      },
      {"data":{
         "uri":"http://localhost:8080/api/rest/v1/workspaces/2/items.json",
         "data":{
            "id":2,
            "category":"Cat2",
            "label":"WKS2"
         }
       }
      }
   ]
}

Есть идеи, что здесь может быть не так?

...