Over a million developers have joined DZone.
Silver Partner

Java API for JSON Processing (JSR-353) - Stream APIs

· Java Zone
Java will soon have a standard set of APIs for processing JSON as part of Java EE 7.  This standard is being defined as JSR 353 - Java API for JSON Processing (JSON-P) and has just passed the Final Approval Ballot (see:  http://www.jcp.org/en/jsr/results?id=5486 ).  JSON-P offers both object oriented and stream based approaches, in this post I will introduce the stream APIs.

You can get JSON-P reference implementation from the link below:

JsonGenerator (javax.json.stream) 
JsonGenerator makes it very easy to create JSON.  With its fluent API the code to produce the JSON very closely resembles the resulting JSON.
package blog.jsonp;
 
import java.util.*;
import javax.json.Json;
import javax.json.stream.*;
 
public class GeneratorDemo {
 
    public static void main(String[] args) {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JsonGenerator.PRETTY_PRINTING, true);
        JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties);
        JsonGenerator jg = jgf.createGenerator(System.out);
         
        jg.writeStartObject()                    // {
            .write("name", "Jane Doe")           //    "name":"Jane Doe",
            .writeStartObject("address")         //    "address":{
                .write("type", 1)                //        "type":1,
                .write("street", "1 A Street")   //        "street":"1 A Street",
                .writeNull("city")               //        "city":null,
                .write("verified", false)        //        "verified":false
            .writeEnd()                          //    },
            .writeStartArray("phone-numbers")    //    "phone-numbers":[
                .writeStartObject()              //        {
                    .write("number", "555-1111") //            "number":"555-1111",
                    .write("extension", "123")   //            "extension":"123"
                .writeEnd()                      //        },
                .writeStartObject()              //        {
                    .write("number", "555-2222") //            "number":"555-2222",
                    .writeNull("extension")      //            "extension":null
                .writeEnd()                      //        }
            .writeEnd()                          //    ]
        .writeEnd()                              // }
        .close();
    }
 
}

Output
Below is the output from running the GeneratorDemo.
{
    "name":"Jane Doe",
    "address":{
        "type":1,
        "street":"1 A Street",
        "city":null,
        "verified":false
    },
    "phone-numbers":[
        {
            "number":"555-1111",
            "extension":"123"
        },
        {
            "number":"555-2222",
            "extension":null
        }
    ]
}

JsonParser (javax.json.stream)
Using JsonParser we will parse the output of the previous example to get the address information. JSON parser provides a depth first traversal of events corresponding to the JSON structure.  Different data can be obtained from the JsonParser depending on the type of the event.
package blog.jsonp;
 
import java.io.FileInputStream;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
 
public class ParserDemo {
 
    public static void main(String[] args) throws Exception  {
        try (FileInputStream json = new FileInputStream("src/blog/jsonp/input.json")) {
            JsonParser jr = Json.createParser(json);
            Event event = null;
     
            // Advance to "address" key
            while(jr.hasNext()) {
                event = jr.next();
                if(event == Event.KEY_NAME && "address".equals(jr.getString())) {
                    event = jr.next();
                    break;
                }
            }
     
            // Output contents of "address" object
            while(event != Event.END_OBJECT) {
                switch(event) {
                    case KEY_NAME: {
                        System.out.print(jr.getString());
                        System.out.print(" = ");
                        break;
                    }
                    case VALUE_FALSE: {
                        System.out.println(false);
                        break;
                    }
                    case VALUE_NULL: {
                        System.out.println("null");
                        break;
                    }
                    case VALUE_NUMBER: {
                        if(jr.isIntegralNumber()) {
                            System.out.println(jr.getInt());
                        } else {
                            System.out.println(jr.getBigDecimal());
                        }
                       break;
                    }
                    case VALUE_STRING: {
                        System.out.println(jr.getString());
                        break;
                    }
                    case VALUE_TRUE: {
                        System.out.println(true);
                        break;
                    }
                    default: {
                    }
                }
                event = jr.next();
            }
        }
    }
 
}

Output
Below is the output from running the ParserDemo.
type = 1
street = 1 A Street
city = null
verified = false

MOXy and the Java API for JSON Processing (JSR-353) 

Mapping your JSON to domain objects is still the easiest way to interact with JSON.  Now that JSR-353 is finalizing we will integrating it into MOXy's JSON-binding.  You can track our progress on this using the following link:

Topics:

Published at DZone with permission of Blaise Doughan , DZone MVB .

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}