Package com.sun.jersey.api.json

Provides support for enabling and configuring JSON.

See: Description

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 enable 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 {
       this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes);
       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. Please note, that you do not need to configure this in much detail. Using JSONConfiguration.Notation.NATURAL notation means that Jersey JSON processor will autamatically take care about numbers, booleans and arrays. This notation will probably become the default one for Jersey in one of the future releases.

For a complete set of supported properties, see JSONConfiguration.Builder.

Copyright © 2016 Oracle Corporation. All Rights Reserved.