2012-05-17 12 views
12

Chúng tôi có toàn bộ các dịch vụ REST JAX-RS chạy trên Apache CXF và Jackson. Chúng tôi sử dụng chú thích JAXB để xử lý các bản tóm tắt POJO thành JSON, hoạt động tốt.Làm cách nào để chuyển JSON thô qua Jackson?

Tuy nhiên, chúng tôi có một hoặc hai vị trí mà chúng tôi muốn trả về chuỗi JSON thô (mà chúng tôi tìm nạp từ bộ nhớ cache Redis).

Jackson luôn bao bọc chuỗi trong dấu ngoặc kép và thoát tất cả dấu ngoặc kép trong đó, ví dụ:

@GET @Produces("application/json") 
public Response getData() { 

    String json = ...get from Redis... 
    return Response.ok(json,"application/json").build() 
} 

cho chúng ta

"{\"test\":1}" 

thay vì

{"test":1} 

Tôi đã thử nhiều thứ, thêm RawSerializer (String.class) để mapper Object, không có gì làm việc. Điều duy nhất mà làm việc là nếu tôi đặt loại phương tiện để chuỗi đơn giản, mà bỏ qua Jackson, nhưng là không tốt, vì tôi đang trở về kiểu nội dung sai

tức

return Response.ok(json,"text/plain").build() 

công trình, nhưng kém (loại nội dung sai, mà vít lên. Net WCF ứng dụng gọi cho chúng tôi)

+0

Tôi đã phải sử dụng Bản đồ thay thế và để Jersey phân tích cú pháp chính xác ... Tôi đã thêm JacksonJsonProvider với mapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY); –

Trả lời

0

ObjectMapper không hoạt động? Nên chỉ là:

ObjectMapper mapper = new ObjectMapper() 
MyObj obj = MyObj(); 
...set values... 
String jsonRes = mapper.writeValueAsString(obj); 
return Response.ok(jsonRes, MediaType.APPLICATION_JSON).build(); 
+0

Không. Nó vẫn chuyển đổi nó ở đâu đó và chuỗi xuất hiện trong câu trả lời. –

0

Trong trường hợp này, cách tốt nhất là sử dụng kiểu trả về của String, vì vấn đề này không phải là với Jackson - có nhiệm vụ tạo ra JSON ngoài đối tượng, không vượt qua Strings như là - nhưng với JAX-RS không gọi Jackson. Nhà cung cấp JSON mặc định được Jackson hỗ trợ sẽ chuyển giá trị String chính xác như (ditto cho byte[]), mà không cần xử lý.

Đối với giá trị, thực tế là phương pháp JsonGenerator.writeRaw(), cho phép nhúng văn bản theo ngữ nghĩa trong OutputStream, nhưng triển khai JAX-RS sử dụng ObjectMapper, không trừu tượng mức thấp.

+0

Không hoạt động. Nếu tôi trả lại String, Jackson vẫn trốn thoát, ví dụ: "{\" kiểm tra \ ": 1}" –

+0

Phiên bản nào? 2.0.2 sẽ hoạt động theo cách này (có trục trặc trong 2.0.0 có thể có liên quan ở đây); cũng như 1.9.x. – StaxMan

10

Tìm thấy giải pháp cuối cùng. Bí quyết là để mở rộng JacksonJsonProvider (mà chúng tôi sử dụng trong CXF để buộc nó để sử dụng Jackson thay vì vứt bỏ) và nói với nó để vượt qua Jackson hoàn toàn khi giao dịch với Strings liệu:

public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType){ 
    if (String.class.equals(type)) { 
     //pass strings as-is, they are most likely cached JSON responses 
     return false; 
    } else { 
     return true; 
    } 
} 

trình hoàn hảo.

+0

Tôi đang gặp phải sự cố tương tự ngay bây giờ ... Bạn có thể cung cấp ví dụ về JacksonJsonProvider đã giải quyết được sự cố không? –

+0

Tôi nên thêm nó ở đâu ??? Tôi đã đăng ký nhà cung cấp dịch vụ của mình, nhưng chưa đăng ký ... 14 tháng 12 năm 2013 8:49:11 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses THÔNG TIN: Các lớp nhà cung cấp được tìm thấy: lớp com.wordnik.swagger. jersey.listing.JerseyApiDeclarationProvider lớp com.tools.web.handler.JacksonJsonProvider –