2009-12-14 3 views
7

Ich benutze JAX-RS, um erholsame Webservices in Java zu erstellen. Ich komme zu viel Overhead in dem produzierten JSON.JAX-RS, Zuordnung von <String, String> zu JSON ohne Overhead?

Datenklasse:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Test { 

    private Map<String,String> data; 

    Test() {} 

    public Test(Map<String,String> data) { 
     this.data = data; 
    } 

    public Map<String, String> getData() { 
     return data; 
    } 
} 

Service:

@GET 
@Path("/test") 
@Produces("application/json; charset=UTF-8;") 
public Test test() { 
    Map<String,String> map = new HashMap<String,String>(); 
    map.put("foo", "bar"); 
    map.put("bingo", "bongo"); 
    return new Test(map); 
} 

Produziert:

{"data":{"entry":[{"key":"foo","value":"bar"},{"key":"bingo","value":"bongo"}]}} 

Ich würde es gerne produzieren:

{"data":{"foo":"bar","bingo":"bongo"}} 

Was ist der einfachste Weg dies zu erreichen? Ich bin frei, meine Datenklasse zu ändern, aber ich kann nicht im Voraus die Schlüssel oder die Größe der Karte wissen.

+1

Angesichts der Overhead der Web-Anfrage, sind Sie sicher, das JSON-Format ist es wert, zu optimieren? (Mit anderen Worten, führte das Profiling Ihrer Anwendung zu der Annahme, dass das Format der JSON-Daten ein Leistungsproblem war?) Denken Sie daran ... Vorzeitige Optimierung ist die Wurzel allen Übels in der Programmierung –

Antwort

5

Der einfachste Weg wäre List<Pair> statt Pair ist nur ein Javabean mit zwei Eigenschaften.

1

zu schreiben Wenn Sie nicht verwenden Mit JAXB annotierte Objekte, aber einfache POJOs, können Sie das richtige Verhalten erzielen, indem Sie einfach die POJO-Mapping-Funktion zusammen mit der Jackson JSON-Bibliothek aktivieren.

So in web.xml, wenn Sie die Filter (ähnlich für Servlet) verwenden, sollten Sie Ihre Konfiguration:

<filter> 
    <filter-name>Jersey</filter-name> 
    <filter-class>...</filter-class> 
    <init-param> 
  <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
  <param-value>true</param-value> 
    </init-param> 
</filter> 

und hängt nur auf der Trikot-json Abhängigkeit im Maven config oder herunterladen von der Website und setzen Sie Jackson in Ihren Klassenpfad. Siehe auch this answer und this answer und this blog post. Und warum in aller Welt ist das kein Standardverhalten, das weiß ich nicht.