Вернуть JSONArray вместо JSONObject, Джерси JAX-RS

я используюJersey сделать некоторые из моих услуг RESTful.

Мой вызов службы REST возвращает меня

{"param1":"value1", "param2":"value2",...."paramN":"valueN"}

Но я хочу это вернуть

["param1":"value1", "param2":"value2",...."paramN":"valueN"]

Какие изменения мне нужно внести в приведенный ниже код?

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<com.abc.def.rest.model.SimplePojo> getSomeList() {
    /* 
            Do something
    */
    return listOfPojos;
}

Часть моейweb.xml файл выглядит так

    <servlet>
        <servlet-name>Abc Jersey REST Service</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.abc.def.rest</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>

Спасибо!

 jhericks03 июн. 2012 г., 00:49
То, что вы хотите вернуть, не является действительным JSON. Ты имеешь ввиду:["value1", "value2", ..."valueN"]?
 jhericks04 июн. 2012 г., 21:07
Является ли SimplePojo JAXB аннотированным pojo? Вы устанавливаете JSONJAXBContext в @Provider где-нибудь?
 Ayaz Pasha06 июн. 2012 г., 11:27
@jhericks - Не могли бы вы дать мне знать, как сделать аннотацию моего SimplePojo JAXB?
 Ayaz Pasha04 июн. 2012 г., 13:26
Да что то типа[{"description1":"value1","name1":"name_"},{"description2":"value2","name2":"name_"},....] но я всегда получаю{"nameOfTheEntity":[{"description1":"value1","name1":"name_"},{"description2":"value2","name2":"name_"},....]}

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

Решение Вопроса

Вы можете определить свой метод обслуживания следующим образом, используя Person POJO:

@GET
@Produces("application/json")
@Path("/list")
public String getList(){
    List<Person> persons = new ArrayList<>();
    persons.add(new Person("1", "2"));
    persons.add(new Person("3", "4"));
    persons.add(new Person("5", "6"));
    // takes advantage to toString() implementation to format as [a, b, c]
    return persons.toString();
}

Класс POJO:

@XmlRootElement
public class Person {
    @XmlElement(name="fn")
    String fn;

    @XmlElement(name="ln")
    String ln;

    public Person(){        
    }

    public Person(String fn, String ln) {
        this.fn = fn;
        this.ln = ln;
    }    

    @Override
    public String toString(){
        try {
            // takes advantage of toString() implementation to format {"a":"b"}
            return new JSONObject().put("fn", fn).put("ln", ln).toString();
        } catch (JSONException e) {
            return null;
        }
    }
}

Результаты будут выглядеть так:

[{"fn":"1","ln":"2"}, {"fn":"3","ln":"4"}, {"fn":"5","ln":"6"}]
 Ayaz Pasha08 июн. 2012 г., 16:06
Спасибо! Решение выше решает мою проблему.
 Ayaz Pasha13 июл. 2012 г., 17:03
Улучшение ответа. С помощью решения выше мы должны переопределитьtoString метод в каждом классе модели, поэтому другое решение, которое я обнаружил,here, click me, Мы заменяем JAXB JSON-сериализатор более качественным JSON-сериализатором, таким как Джексон. С этим решением нам не нужно изменять все классы моделей, которые предоставляются как сервисы REST. С очень небольшим изменением конфигурации и настройкойMessageBodyWriter класс Джерси сделаю.

Чтобы вернуть записи в стиле массива, вы должны построить свою сущность из массива. Попробуйте следующее:

@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON})
public Response getSomeList() {
    List<com.abc.def.rest.model.SimplePojo> yourListInstance = 
          new List<com.abc.def.rest.model.SimplePojo>();
    /* 
          Do something
    */
    return Response.ok(yourListInstance.toArray()).build();
}

если у вас возникли проблемы в зависимости от типа возвратаtoArray() Метод - вы можете явно привести ваш массив:

Response
   .ok((com.abc.def.rest.model.SimplePojo[])yourListInstance.toArray())
   .build(); 

UPD: попробуйте преобразовать ваш список в JSONArray:

JSONArray arr = new JSONArray();
for (SimplePojo p : yourListInstance) {
  arr.add(p);
}

а потом:

Response.ok(arr).build(); 
 Ayaz Pasha04 июн. 2012 г., 15:49
Для измененияResponse.ok((com.abc.def.rest.model.SimplePojo[])yourListInstance.toArray()) .build(); я получилcom.sun.jersey.spi.container.ContainerResponse mapMappableContainerException java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.abc.def.rest.model.SimplePojo;
 04 июн. 2012 г., 15:46
вам нужно добавитьjersey-json к вашему классу
 Ayaz Pasha04 июн. 2012 г., 16:13
в этот момент я получаю список моих SimplePojo (s)
 Ayaz Pasha04 июн. 2012 г., 15:35
Для измененияreturn Response.ok(listOfPojos.toArray()).build(); Я получаю ошибкуSEVERE: A message body writer for Java class [Ljava.lang.Object;, and Java type class [Ljava.lang.Object;, and MIME media type application/json was not found
 04 июн. 2012 г., 15:56
отладьте до этого момента и посмотрите, что у вас там есть.

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