2009-12-14 15 views
7

JAX-RS'yi, Java'da huzurlu web servisleri oluşturmak için kullanıyorum. Üretilen JSON'da çok fazla yüküm var.JAX-RS, Harita <String, String> ek yükü olmadan JSON'a mı?

Veri sınıfı:

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

Hizmeti:

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

üretir:

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

Ben üretmek istiyorum:

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

Bunu başarmanın en basit yolu nedir? Veri sınıfımı yeniden tanımlamakta özgürüm, ancak haritanın anahtarlarını veya boyutunu önceden bilmiyorum.

+1

Web isteğinin ek yükü göz önüne alındığında, json formatının optimizasyona değer olduğuna emin misiniz? (Başka bir deyişle, uygulamanızın profil oluşturması, json verilerinin formatının bir performans sorunu olduğuna inanmanıza neden oldu mu?) Hatırlayın ... Erken optimizasyon, programlamanın tüm kötülüğünün köküdür. –

cevap

5

En basit yol, Pair yalnızca iki özellikli bir Javabean olduğu List<Pair> kullanıyor olsaydı. Bunun ışığında

1

yazmak için çok şey var JAXB açıklamalı nesneler, ancak basit POJO'lar, sadece JSJ kütüphanesi ile birlikte POJO haritalama özelliğini etkinleştirerek doğru davranışı elde edebilirsiniz.

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

Ve maven config forması-json bağımlılığı bağlıdır veya indirmek sadece: Yani web.xml yılında

sen (servlet için benzer) filtre kullanıyorsanız, yapılandırma olmalıdır Web sitesinden ve jackson'u sınıf yolunuza koyun. Ayrıca bkz. this answer ve this answer ve this blog post. Ve neden dünyadaki bu standart davranış değil bilmiyorum.