Handle JSON object Tag(s): Networking XML/RSS/JSON


JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is used primarily to transmit data between a server and web application, as an alternative to XML.

JSON structures are easy to manipulate from Java. The required libraries are now included in the Java EE 7 specification.

Create a JSON object from a String
In this HowTo, we create a JSON object from a String.

In a MAVEN project, add this dependency

  <dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.0.4</version>
  </dependency>
or download the jars from https://jsonp.java.net/download.html
import java.io.StringReader;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;

// https://jsonp.java.net/download.html
public class Json1 {
   String jsonString = "{" +
      "     \"firstName\": \"John\", \"lastName\": \"Smith\", \"age\": 25," +
      "     \"address\" : { " +
      "     \"streetAddress\": \"21 2nd Street\"," +
      "     \"city\": \"New York\"," +
      "     \"state\": \"NY\"," +
      "     \"postalCode\": \"10021\"" +
      "     }," +
      "     \"phoneNumber\": [" +
      "         { \"type\": \"home\", \"number\": \"212 555-1234\" }," +
      "         { \"type\": \"fax\", \"number\": \"646 555-4567\" }" +
      "     ]" +
      "}";

   public static void main(String args[]) {
      Json1 x = new Json1();
      x.doit();
   }

   public void doit() {
      JsonReader reader = Json.createReader(new StringReader(jsonString));
      JsonObject object = reader.readObject();
      reader.close();
      System.out.println(object.getString("firstName") + " " + object.getString("lastName")) ;
      System.out.println(object.getJsonObject("address").getString("city")) ;
      /*
          output :
            John Smith
            New York
      */
   }
}
Create a JSON object from a File
To use a file, replace the StringReader by a FileReader.
Create a JSON object from code

Now, we want to create the JSON object from code.

import javax.json.Json;
import javax.json.JsonObject;

public class Json2 {
   public static void main(String args[]) {
      Json2 x = new Json2();
      x.doit();
   }

   public void doit() {
      JsonObject object = Json.createObjectBuilder()
        .add("firstName", "John")
        .add("lastName", "Smith")
        .add("age", 25)
        .add("address", Json.createObjectBuilder()
           .add("streetAddress", "21 2nd Street")
           .add("city", "New York")
           .add("state", "NY")
           .add("postalCode", "10021"))
        .add("phoneNumber", Json.createArrayBuilder()
           .add(Json.createObjectBuilder()
           .add("type", "home")
           .add("number", "212 555-1234"))
           .add(Json.createObjectBuilder()
           .add("type", "fax")
           .add("number", "646 555-4567")))
        .build();

      System.out.println(object.getString("firstName") + " " + object.getString("lastName")) ;
      System.out.println(object.getJsonObject("address").getString("city")) ;
   }
}
Create a JSON object from a REST service response
To call the REST service, we will use the HTTPClient module from Apache.

In a MAVEN project, add these dependencies

  <dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.0.4</version>
  </dependency>

  <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3.5</version>
  </dependency>
or download the required jars from : For the demonstration, we call http://jsonplaceholder.typicode.com/ which is Fake Online REST API for Testing and Prototyping.

The first example calls jsonplaceholder.typicode.com/posts/1 to get the first message. From the response, we extract the id and the title.

The raw response looks like

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit ...eveniet architecto"
}

import java.io.InputStreamReader;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;

import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

public class Json3 {
   public static void main(String args[]) throws Exception {
      Json3 x = new Json3();
      x.doit();
   }

   public void doit() throws Exception {
      JsonReader reader = null;
      CloseableHttpClient client = HttpClientBuilder.create().build();
      HttpHost target = new HttpHost("jsonplaceholder.typicode.com", 80, "http");
      HttpGet request = new HttpGet("/posts/1");
      request.addHeader("accept", "application/json");
      CloseableHttpResponse response = null;
      try {
         response = client.execute(target, request);
         if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
            throw new Exception("Failed : HTTP error code : "
               + response.getStatusLine().getStatusCode());
         }

         reader = Json.createReader(new InputStreamReader((response.getEntity().getContent())));
         JsonObject object = reader.readObject();

         // System.out.println("raw : " + object.toString()) ;
         System.out.println("id : " + object.getJsonNumber("id")) ;
         System.out.println("title : " + object.getString("title")) ;
         /*
            output
              id : 1
              title : sunt aut facere repellat provident occaecati excepturi optio reprehenderit
              Done.
         */
        }
     finally {
        if (reader != null) reader.close();
        if (client != null) client.close();
        if (response != null) response.close();
        System.out.println("Done.");
     }
   }
}

Now we call jsonplaceholder.typicode.com/posts which returns a message list of 100 elements. From the response, we iterate the returned array to display the id and the title.

The raw response looks like

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit ...eveniet architecto"
  }
...
  {
    "userId": 10,
    "id": 100,
    "title": "at nam consequatur ea labore ea harum",
    "body": "cupiditate quo est a modi nesciunt ... ratione error aut"
  }
]

import java.io.InputStreamReader;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;

import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

public class Json4 {
   public static void main(String args[]) throws Exception {
      Json4 x = new Json4();
      x.doit();
   }

   public void doit() throws Exception {
      JsonReader reader = null;
      CloseableHttpClient client = HttpClientBuilder.create().build();
      HttpHost target = new HttpHost("jsonplaceholder.typicode.com", 80, "http");
      HttpGet request = new HttpGet("/posts");
      request.addHeader("accept", "application/json");
      CloseableHttpResponse response = null;
      try {
         response = client.execute(target, request);
         if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
            throw new Exception("Failed : HTTP error code : "
                + response.getStatusLine().getStatusCode());
         }

         reader = Json.createReader(new InputStreamReader((response.getEntity().getContent())));
         JsonArray array = reader.readArray();

         for (int j = 0; j < array.size(); j++  ) {
            JsonObject jo = array.getJsonObject(j);
            System.out.println("id : " + jo.getJsonNumber("id")) ;
            System.out.println("title : " + jo.getString("title")) ;
         }
         /*
            output
              id : 1
              title : sunt aut facere repellat provident occaecati excepturi optio reprehenderit
              ...
              id : 100
              title : at nam consequatur ea labore ea harum
              Done.
         */
      }
      finally {
         if (reader != null) reader.close();
         if (client != null) client.close();
         if (response != null) response.close();
         System.out.println("Done.");
      }
   }
}
The same operation using JsonParser and InputStream
import java.io.InputStream;

import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;

import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;


//https://jsonp.java.net/download.html
//http://hc.apache.org/downloads.cgi

public class Json5 {

   public static void main(String args[]) throws Exception {
      Json5 x = new Json5();
      x.doit();
   }

   public void doit() throws Exception {
      CloseableHttpClient client = HttpClientBuilder.create().build();
      HttpHost target = new HttpHost("jsonplaceholder.typicode.com", 80, "http");
      HttpGet request = new HttpGet("/posts");
      request.addHeader("accept", "application/json");
      CloseableHttpResponse response = null;
      try {
         response = client.execute(target, request);
         if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
            throw new Exception("Failed : HTTP error code : "
                  + response.getStatusLine().getStatusCode());
         }

         InputStream is = response.getEntity().getContent();
         JsonParser parser = Json.createParser(is);
         while (parser.hasNext()) {
            Event e = parser.next();
            if (e == Event.KEY_NAME) {
               switch (parser.getString()) {
               case "id":
                  parser.next();
                  System.out.print(parser.getString());
                  System.out.print(": ");
                  break;
               case "title":
                  parser.next();
                  System.out.println(parser.getString());
                  System.out.println("---------");
                  break;
               }
            }
         }
         /*
           output :
           1: sunt aut facere repellat provident occaecati excepturi optio reprehenderit
           -------------
           2: qui est esse
           ---------
           ...
           99: temporibus sit alias delectus eligendi possimus magni
           ---------
           100: at nam consequatur ea labore ea harum
           ---------
           Done.
          */
      }
      finally {
         if (client != null) client.close();
         if (response != null) response.close();
         System.out.println("Done.");
      }
   }
}
Create a Java object from a JSON object
It's possible to do it by hand by calling the jasonobject.get[type] and the corresponding DTO/POJO set methods. But it is easier to use a library to handle the finer details. One library which is nice is GSON.

In Maven project, use

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.3.1</version>
</dependency>
or download the jar from here

Again from our REST example at jsonplaceholder.typicode.com/posts/1 , we define a DTO/POJO as :

public class JsonPlaceHolderPosts {
   int userid;
   int id;
   String title;
   String body;

   public int getUserid() {
      return userid;
   }
   public void setUserid(int userid) {
      this.userid = userid;
   }
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public String getTitle() {
      return title;
   }
   public void setTitle(String title) {
      this.title = title;
   }
   public String getBody() {
      return body;
   }
   public void setBody(String body) {
      this.body = body;
   }
}
and then from a JSON stream, we create the Java object
import java.io.InputStreamReader;

import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

import com.google.gson.Gson;

// https://jsonp.java.net/download.html
// http://hc.apache.org/downloads.cgi
// http://search.maven.org/#artifactdetails|com.google.code.gson|gson|2.3.1|jar

public class Json6 {

     public static void main(String args[]) throws Exception {
        Json6 x = new Json6();
        x.doit();
     }

     public void doit() throws Exception {
        CloseableHttpClient client = HttpClientBuilder.create().build();
        HttpHost target = new HttpHost("jsonplaceholder.typicode.com", 80, "http");
        HttpGet request = new HttpGet("/posts/1");
        request.addHeader("accept", "application/json");
        CloseableHttpResponse response = null;
        try {
           response = client.execute(target, request);
           if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
               throw new Exception("Failed : HTTP error code : "
                  + response.getStatusLine().getStatusCode());
           }

           Gson gson = new Gson();
           JsonPlaceHolderPosts jphp = gson.fromJson(new InputStreamReader
                 (response.getEntity().getContent()), JsonPlaceHolderPosts.class);
           System.out.println("id : " + jphp.getId()) ;
           System.out.println("title : " + jphp.getTitle()) ;
           /*
              ouput:
              id : 1
              title : sunt aut facere repellat provident occaecati excepturi optio reprehenderit
              Done.
           */
        }
        finally {
           if (client != null) client.close();
           if (response != null) response.close();
           System.out.println("Done.");
        }
     }
}
Create a JSON string from a Java object
Finally, from a Java object, create a JSON string.
import com.google.gson.Gson;

// http://search.maven.org/#artifactdetails|com.google.code.gson|gson|2.3.1|jar

public class Json7 {

   public static void main(String args[]) throws Exception {
      Json7 x = new Json7();
      x.doit();
   }

   public void doit() throws Exception {
      JsonPlaceHolderPosts jphp = new JsonPlaceHolderPosts();
      jphp.setUserid(1111);
      jphp.setId(2222);
      jphp.setTitle("foo");
      jphp.setBody("bar");

      Gson gson = new Gson();
      String json = gson.toJson(jphp, JsonPlaceHolderPosts.class);
      System.out.println("json : " + json) ;
      System.out.println("Done.");
      /*
       output :
       json : {"userid":1111,"id":2222,"title":"foo","body":"bar"}
       Done.
      */
   }
}


blog comments powered by Disqus