2009-12-14 28 views
7

Tôi đang sử dụng JAX-RS để tạo các dịch vụ web an toàn trong Java. Tôi đang nhận được nhiều chi phí trong JSON được tạo ra.JAX-RS, Bản đồ <String, String> đến JSON mà không có phí trên không?

lớp dữ liệu:

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

dịch vụ:

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

Tạo:

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

Tôi muốn nó để sản xuất:

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

Cách đơn giản nhất để đạt được điều này là gì? Tôi được tự do xác định lại lớp dữ liệu của mình nhưng tôi không thể biết trước các khóa hoặc kích thước của bản đồ.

+1

Với chi phí của yêu cầu web, bạn có chắc định dạng json đáng được tối ưu hóa không? (Nói cách khác, đã làm hồ sơ ứng dụng của bạn dẫn bạn tin rằng định dạng của dữ liệu json là một vấn đề hiệu suất?) Hãy nhớ ... Tối ưu hóa sớm là gốc rễ của tất cả điều ác trong lập trình –

Trả lời

5

Cách đơn giản nhất sẽ sử dụng List<Pair> thay vì nơi Pair chỉ là Javabean có hai thuộc tính.

1

Nếu bạn không sử dụng Các đối tượng được chú thích JAXB, nhưng chỉ đơn giản là POJO, bạn có thể có được hành vi đúng bằng cách đơn giản bật tính năng lập bản đồ POJO, cùng với thư viện JSON JSON.

Vì vậy, trong web.xml, nếu bạn đang sử dụng bộ lọc (tương tự cho servlet), cấu hình của bạn nên là:

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

Và chỉ phụ thuộc vào sự phụ thuộc jersey-json theo cấu hình maven của bạn, hoặc tải xuống từ trang web và đặt jackson trong classpath của bạn. Xem thêm this answerthis answerthis blog post. Và tại sao trên trái đất này không phải là hành vi tiêu chuẩn mà tôi không biết.

Các vấn đề liên quan