Json in Minitab

Java provides built-in support for JSON encoding and decoding through libraries like Jackson or Gson. In this example, we’ll use Gson for JSON operations.

First, we need to add Gson to our project. If you’re using Maven, add this to your pom.xml:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

Now, let’s look at the Java code:

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class JsonExample {

    // We'll use these two classes to demonstrate encoding and
    // decoding of custom types below.
    static class Response1 {
        int page;
        String[] fruits;

        public Response1(int page, String[] fruits) {
            this.page = page;
            this.fruits = fruits;
        }
    }

    // In Java, we use annotations to customize the JSON key names.
    static class Response2 {
        @SerializedName("page")
        int page;
        @SerializedName("fruits")
        String[] fruits;

        public Response2(int page, String[] fruits) {
            this.page = page;
            this.fruits = fruits;
        }
    }

    public static void main(String[] args) {
        Gson gson = new Gson();

        // First we'll look at encoding basic data types to
        // JSON strings. Here are some examples for atomic values.
        System.out.println(gson.toJson(true));
        System.out.println(gson.toJson(1));
        System.out.println(gson.toJson(2.34));
        System.out.println(gson.toJson("gopher"));

        // And here are some for slices and maps, which encode
        // to JSON arrays and objects as you'd expect.
        String[] slcD = {"apple", "peach", "pear"};
        System.out.println(gson.toJson(slcD));

        Map<String, Integer> mapD = new HashMap<>();
        mapD.put("apple", 5);
        mapD.put("lettuce", 7);
        System.out.println(gson.toJson(mapD));

        // The Gson package can automatically encode your
        // custom data types. It will only include public
        // fields in the encoded output and will by default
        // use those names as the JSON keys.
        Response1 res1D = new Response1(1, new String[]{"apple", "peach", "pear"});
        System.out.println(gson.toJson(res1D));

        // You can use annotations on class field declarations
        // to customize the encoded JSON key names. Check the
        // definition of `Response2` above to see an example
        // of such annotations.
        Response2 res2D = new Response2(1, new String[]{"apple", "peach", "pear"});
        System.out.println(gson.toJson(res2D));

        // Now let's look at decoding JSON data into Java
        // objects. Here's an example for a generic data
        // structure.
        String byt = "{\"num\":6.13,\"strs\":[\"a\",\"b\"]}";

        // We need to provide a Type where Gson can put the 
        // decoded data. This Map<String, Object> will hold 
        // a map of strings to arbitrary data types.
        Type type = new TypeToken<Map<String, Object>>(){}.getType();
        Map<String, Object> dat = gson.fromJson(byt, type);
        System.out.println(dat);

        // In order to use the values in the decoded map,
        // we'll need to cast them to their appropriate type.
        // For example here we cast the value in `num` to
        // the expected `Double` type.
        double num = ((Double) dat.get("num")).doubleValue();
        System.out.println(num);

        // Accessing nested data requires a series of casts.
        String str1 = ((ArrayList<String>) dat.get("strs")).get(0);
        System.out.println(str1);

        // We can also decode JSON into custom data types.
        // This has the advantages of adding additional
        // type-safety to our programs and eliminating the
        // need for type assertions when accessing the decoded
        // data.
        String str = "{\"page\": 1, \"fruits\": [\"apple\", \"peach\"]}";
        Response2 res = gson.fromJson(str, Response2.class);
        System.out.println(res.page);
        System.out.println(res.fruits[0]);

        // In the examples above we always used strings as 
        // intermediates between the data and JSON representation. 
        // We can also stream JSON encodings directly to 
        // Writers like System.out or even HTTP response bodies.
        gson.toJson(mapD, System.out);
    }
}

To run the program, compile and execute the Java file:

$ javac -cp gson-2.8.9.jar JsonExample.java
$ java -cp .:gson-2.8.9.jar JsonExample
true
1
2.34
"gopher"
["apple","peach","pear"]
{"apple":5,"lettuce":7}
{"page":1,"fruits":["apple","peach","pear"]}
{"page":1,"fruits":["apple","peach","pear"]}
{num=6.13, strs=[a, b]}
6.13
a
1
apple
{"apple":5,"lettuce":7}

We’ve covered the basics of JSON in Java here, but check out the Gson User Guide for more detailed information.