2009-12-14 10 views
7

Utilizzo JAX-RS per creare servizi Web riposanti in Java. Sto arrivando a molto overhead nel prodotto JSON.JAX-RS, Map <String, String> to JSON senza l'overhead?

classe di dati:

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

Servizio:

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

Produce:

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

Vorrei di produrre:

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

Qual è il modo più semplice per ottenere questo? Sono libero di ridefinire la mia classe di dati, ma non posso sapere in anticipo le chiavi o la dimensione della mappa.

+1

Dato il sovraccarico della richiesta web, sei sicuro che il formato JSON valga la pena di essere ottimizzato? (In altre parole, il profiling della tua applicazione ti ha portato a credere che il formato dei dati JSON fosse un problema di prestazioni?) Ricorda ... L'ottimizzazione prematura è la radice di tutto il male nella programmazione –

risposta

5

Il modo più semplice sarebbe utilizzare List<Pair> invece dove Pair è solo un Javabean con due proprietà.

1

Se non si utilizza Oggetti con annotazione JAXB, ma POJO semplici, è possibile ottenere il comportamento corretto semplicemente abilitando la funzione di mappatura POJO, insieme alla libreria Jackson JSON.

Quindi, in web.xml, se si sta utilizzando il filtro (simile per servlet), la configurazione dovrebbe essere:

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

E proprio dipenderà dalla dipendenza jersey-JSON nella configurazione Maven, o scaricarlo dal sito Web e inserisci Jackson nel tuo classpath. Vedi anche this answer e this answer e this blog post. E perché sulla terra questo non è un comportamento standard che non conosco.

Problemi correlati