2009-12-14 10 views
7

Używam JAX-RS do tworzenia spokojnych serwisów WWW w Javie. W wyprodukowanym JSON'ie dostaję dużo więcej.JAX-RS, Map <String, String> na JSON bez obciążenia?

klasa danych:

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

Usługa:

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

Produkuje:

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

chciałbym go produkować:

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

Jaki jest najprostszy sposób na osiągnięcie tego? Mogę zmienić moją klasę danych, ale nie mogę z góry znać kluczy ani rozmiaru mapy.

+1

Biorąc pod uwagę obciążenie związane z żądaniem internetowym, czy na pewno warto zoptymalizować format json? (Innymi słowy, czy profilowanie twojej aplikacji doprowadziło cię do przekonania, że ​​format danych json był problemem z wydajnością?) Pamiętaj ... Przedwczesna optymalizacja jest źródłem wszelkiego zła w programowaniu –

Odpowiedz

5

Najprostszym sposobem byłoby użycie List<Pair> zamiast, gdzie Pair jest tylko jawajski z dwoma właściwościami.

1

Jeśli nie używać JAXB z adnotacjami obiektów, ale proste POJO, można uzyskać prawidłowe zachowanie, po prostu włączając funkcję mapowania POJO, wraz z biblioteką Jackson JSON.

Więc w web.xml, jeśli używasz filtra (podobny do serwletu), konfiguracja powinna być:

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

I właśnie zależy od uzależnienia jersey-json w maven config, lub pobrać go ze strony internetowej i umieść jacksona w swojej ścieżce klas. Zobacz także this answer i this answer i this blog post. I dlaczego, na ziemi, nie jest to standardowe zachowanie, nie wiem.

Powiązane problemy