2012-01-05 27 views
6

Làm cách nào để JAXB giữ lại các giá trị rỗng khi nhận được một cú pháp JSON chứa giá trị null hoặc "".JAX-RS Jersey JSON bảo toàn null bằng cách sử dụng chú thích

String: {"id":null,"fname":"John","region":""}

lợi nhuận Object:

Person { 
    Integer id = 0 
    String fname = "John" 
    Region regions = 0 } 

Tôi muốn nó để trở về null thay vì 0

Dưới đây là những gì tôi có cho đến nay:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 
    private JAXBContext context; 
    private Class<?>[] types = {Person.class}; 

    public JAXBContextResolver() throws Exception { 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types); 
    } 

    public JAXBContext getContext(Class<?> objectType) { 
     for (Class<?> c : types) { 
      if (c.equals(objectType)) { 
       return context; 
      } 
     } 
     return null; 
    } 
} 

Person.class được chú thích với @XmlRootElement Tôi đã thử tìm kiếm vào các chú thích của Jackson nhưng không thành công.

+0

Cùng một vấn đề ở đây. Ai đó có một giải pháp cho vấn đề này. ObjectMapper dường như cũng bị bỏ qua bởi Jersey – keatch

+0

Cùng một vấn đề. Tôi cũng đã cố gắng sử dụng ObjectMapper và Jersey không thể nhặt nó lên là tốt.Tôi không chắc chắn rằng việc sử dụng ObjectMapper là giải pháp đơn giản nhất ... – Oleksi

+1

Sự cố tương tự của tôi đã được giải quyết. Bạn có thể xem liệu nó có giúp bạn ... http: //stackoverflow.com/questions/10420641/including-null-elements-in-json-output-of-jersey-restful-api-with-jaxb – Oleksi

Trả lời

3

Lưu ý: Tôi là người lãnh đạo EclipseLink JAXB (MOXy) và là thành viên của nhóm chuyên gia JAXB (JSR-222).

Dưới đây là ví dụ về cách thực hiện điều này với MOXy.

Person

MOXY sẽ unmarshal đối tượng Person như bạn muốn mà không chỉ định bất kỳ siêu dữ liệu. Để có JSON đầu ra chứa các giá trị null, bạn có thể sử dụng chú thích @XmlElement(nillable=true) (xem Binding to JSON & XML - Handling Null).

package forum8748537; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Person { 

    @XmlElement(nillable=true) 
    Integer id; 

    @XmlElement(nillable=true) 
    String fname; 

    @XmlElement(nillable=true) 
    Region regions; 

} 

jaxb.properties

Để xác định MOXY như JAXB của bạn cung cấp (JSR-222), bạn cần phải thêm một tập tin gọi là jaxb.properties trong gói giống như các lớp miền của bạn với các mục sau đây (xem Specifying EclipseLink MOXy as Your JAXB Provider).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

Demo

package forum8748537; 

import java.io.StringReader; 
import java.util.*; 

import javax.xml.bind.*; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(2); 
     properties.put("eclipselink.media-type", "application/json"); 
     properties.put("eclipselink.json.include-root", false); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {Person.class}, properties); 

     StringReader json = new StringReader("{\"id\":null,\"fname\":\"John\",\"region\":\"\"}"); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Person person = unmarshaller.unmarshal(new StreamSource(json), Person.class).getValue(); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(person, System.out); 
    } 

} 

Output

{ 
    "id" : null, 
    "fname" : "John", 
    "regions" : null 
} 

Sử dụng MOXY trong một ứng dụng JAX-RS

Đối với một n ví dụ của việc sử dụng MOXY trong một ứng dụng JAX-RS xem:

0

Tính đến JSON-B JSR-367 (JAX-RS 2.1 JSR-370), sau đây chú thích hoạt động thay vì @XmlElement.

@JsonbProperty(nillable = true) 
Các vấn đề liên quan