2012-06-01 16 views
7

Ich verwende Jersey, um einige meiner Dienste RESTful zu machen.Rückgabe JSONArray anstelle von JSONObject, Jersey JAX-RS

Mein REST-Service Aufruf gibt mir

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

Aber, ich will es

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

Was sind die Änderungen, die ich sind zurückkommen müssen in der unten stehenden Code machen?

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

Teil meiner web.xml Datei sieht wie folgt aus

<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> 

Dank!

+0

Was Sie wollen, zurückgeben ist kein gültiger JSON. Meinst du: '[" Wert1 "," Wert2 ", ..." WertN "]'? – jhericks

+0

Ja, etwas wie '[{" description1 ":" value1 "," name1 ":" name _ "}, {" description2 ":" value2 "," name2 ":" name _ "}, ....]' aber Ich bekomme immer '{" nameOfTheEntity ": [{" description1 ":" value1 "," name1 ":" name _ "}, {" description2 ":" value2 "," name2 ":" name _ "}, .. ..]} ' –

+1

Ist SimplePojo ein mit JAXB annotierter Pojo? Richten Sie irgendwo in einem @Provider einen JSONJAXBContext ein? – jhericks

Antwort

11

Sie können Ihre Service-Methode wie folgt definieren, indem 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(); 
} 

Die POJO Klasse:

@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; 
     } 
    } 
} 

Die Ergebnisse werden wie folgt aussehen:

[{"fn":"1","ln":"2"}, {"fn":"3","ln":"4"}, {"fn":"5","ln":"6"}] 
+0

Danke! Die obige Lösung löst mein Problem. –

+4

Die Antwort verbessern. Mit der obigen Lösung müssen wir die Methode ** toString ** in jeder Modellklasse überschreiben, daher ist die andere Lösung, die ich herausgefunden habe, [hier, klick mich] (http://stackoverflow.com/questions/2199453/how-can -i-customize-serialization-einer-Liste-von-jaxb-objects-to-json). Wir ersetzen den JAXB JSON Serializer durch einen besser benannten JSON Serializer wie Jackson. Mit dieser Lösung müssen nicht alle Modellklassen geändert werden, die als REST-Services verfügbar sind. Mit sehr wenig Konfigurationsänderung und Customizing "MessageBodyWriter" -Klasse von Jersey wird. –

2

Um die Einträge im Array-Stil zurückzugeben, sollten Sie Ihre Entity aus dem Array erstellen. Versuchen Sie Folgendes:

@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(); 
} 

, wenn Sie einige Probleme nach Gesicht Art von toArray() Methode zurückgeben - man könnte explizit Array Stimmen:

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

UPD: versuchen Sie, Ihre Liste zu JSONArray konvertieren:

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

und dann:

Response.ok(arr).build(); 
+0

Für die Änderung 'return Response.ok (listOfPojos.toArray()). Build();' Ich erhalte den Fehler SEVERE: Eine Nachricht Body Writer für Java-Klasse [Ljava.lang.Object; und Java-Klasse [Ljava .lang.Object; und MIME-Medientyp application/json wurde nicht gefunden ' –

+0

Sie müssen 'jersey-json' zu Ihrem Klassenpfad hinzufügen –

+0

Für die Änderung' Response.ok ((com.abc.def.rest.model. SimplePojo []) yourListInstance.toArray()) .build(); 'I get' com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException java.lang.ClassCastException: [Ljava.lang.Object; kann nicht in [Lcom.abc.def.rest.model.SimplePojo; ' –

Verwandte Themen