Package com.sun.jersey.api.json

Provides support for enabling and configuring JSON.

See:
          Description

Class Summary
JSONJAXBContext An adaption of JAXBContext that supports marshalling and unmarshalling of JAXB beans using the JSON format.
 

Enum Summary
JSONJAXBContext.JSONNotation Enumeration of supported JSON notations.
 

Package com.sun.jersey.api.json Description

Provides support for enabling and configuring JSON.

Besides enabling JSON, the API also allows customization of the JSON format produced and consumed with JAXB beans. Such customization requires that an implementation of ContextResolver returns a configured JSONJAXBContext instance.

For example, if the following two JAXB beans are defined:

 @XmlRootElement
 public class BeanOne {
   public String name;
   public int number;
 }

 @XmlRootElement
 public class BeanTwo {
   public List<String> titles;
 }
 
And the following resource class uses the above JAXB beans:
 @Path("beans")
 public class MyResource {

   @GET @Path("one") @Produces(MediaType.APPLICATION_JSON)
   public BeanOne getOne() {
       BeanOne one = new BeanOne();
       one.name = "Howard";
       one.number = 3;
       return one;
   }

   @GET @Path("two") @Produces(MediaType.APPLICATION_JSON)
   public BeanTwo getTwo() {
       BeanTwo two = new BeanTwo();
       two.titles = new ArrayList(1){{add("Title1");}};
       return two;
   }
 

Then, for the URI path beans/one, the following JSON will be produced:

 {"name":"Howard","number":"3"}
 
However, it might be required that the JSON object named number have a non-String value 3.

And, for the URI path beans/two, the following JSON will be produced:

 {"titles":"Title1"}
 
However, it might be required that the JSON object named titles have a JSON array value ["Title1"], since the titles field on the JAXB bean BeanTwo represents an array, thus enabling consuming of such JSON values the same way on the client side no matter how many elements the array contains.

The JSONJAXBContext may be configured to enabled such required production of JSON as described above in the following manner:

 @Provider
 public final class JAXBContextResolver implements ContextResolver<JAXBContext> {

   private final JAXBContext context;

   private final Set<Class> types;

   private final Class[] cTypes = {BeanOne.class, BeanTwo.class};

   public JAXBContextResolver() throws JAXBException {
       Map<String, Object> props = new HashMap<String, Object>();
       props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE);
       props.put(JSONJAXBContext.JSON_NON_STRINGS, new HashSet<String>(1){{add("number");}});
       props.put(JSONJAXBContext.JSON_ARRAYS, new HashSet<String>(1){{add("titles");}});
       this.context = new JSONJAXBContext(cTypes, props);
 
       this.types = new HashSet(Arrays.asList(cTypes));
   }

   public JAXBContext getContext(Class<?> objectType) {
       return (types.contains(objectType)) ? context : null;
   }
 }
 
Then, the produced JSON would become: {"name":"Howard","number":3} and {"titles":["Title1"]} respectively for the URI paths beans/one and beans/two.

For a complete set of supported properties, see JSONJAXBContext.



Copyright © 2008 Sun Microsystems, Inc. All Rights Reserved.