JAX-RS, Map<String,String> in JSON, ohne den Aufwand?
Bin ich mit JAX-RS zu erstellen, restful webservices in Java. Ich bin immer zu viel Aufwand in das produzierte JSON.
Daten Klasse:
@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, redifine meine Daten Klasse, aber ich kann nicht im Voraus wissen, die Tasten oder der Größe der Karte.
- Angesichts der overhead des web-Anfrage, sind Sie sicher, dass das json-format lohnt sich die Optimierung? (In anderen Worten, hast profiling Ihrer Anwendung führen Sie zu glauben, das format der json-Daten wurde ein performance-Problem?) Denken Sie daran... Vorzeitige Optimierung ist die Wurzel allen übels in der Programmierung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfachste Weg wäre mit
List<Pair>
statt, woPair
ist nur ein Javabean mit zwei Eigenschaften."JAXB Spezifikation definiert eine spezielle Behandlung für die Karte, wenn es als Eigenschaft eines bean".
In Anbetracht dieser, ich glaube nicht, dass es viel Sie tun können (derzeit) außer vielleicht, to schreiben Sie Ihre eigenen MessageBodyWriter (https://jsr311.dev.java.net/nonav/javadoc/javax/ws/rs/ext/MessageBodyWriter.html)
Wenn Sie nicht mit JAXB annotierte Objekte, sondern auch einfache POJO ' s, Sie können das richtige Verhalten ganz einfach durch aktivieren der POJO-mapping-Funktion, zusammen mit der Jackson-JSON-Bibliothek.
So, in
web.xml
, wenn Sie die filter (ähnlich wie bei servlet), die Konfiguration sollte werden:Und allein auf die jersey-json-Abhängigkeit in Ihrem maven config, oder laden Sie es von der website und setzen Sie jackson in den classpath. Siehe auch diese Antwort und diese Antwort, und in diesem blog-post. Und warum auf der Erde nicht standard-Verhalten, weiß ich nicht.