Json in Miranda

Our program will demonstrate JSON encoding and decoding in Java, including handling of custom data types.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.*;

public class JsonExample {

    // We'll use these two classes to demonstrate encoding and
    // decoding of custom types below.
    static class Response1 {
        public int page;
        public List<String> fruits;
    }

    // Fields must be public or have getter/setter methods to be serialized/deserialized
    static class Response2 {
        @JsonProperty("page")
        public int page;

        @JsonProperty("fruits")
        public List<String> fruits;
    }

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

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

        // And here are some for slices and maps, which encode
        // to JSON arrays and objects as you'd expect.
        List<String> slcD = Arrays.asList("apple", "peach", "pear");
        System.out.println(mapper.writeValueAsString(slcD));

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

        // The Jackson library can automatically encode your
        // custom data types. It will use the field names as the JSON keys.
        Response1 res1D = new Response1();
        res1D.page = 1;
        res1D.fruits = Arrays.asList("apple", "peach", "pear");
        System.out.println(mapper.writeValueAsString(res1D));

        // You can use annotations on class fields
        // to customize the encoded JSON key names. Check the
        // definition of `Response2` above to see an example
        // of such annotations.
        Response2 res2D = new Response2();
        res2D.page = 1;
        res2D.fruits = Arrays.asList("apple", "peach", "pear");
        System.out.println(mapper.writeValueAsString(res2D));

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

        // We need to provide a type where the Jackson library
        // can put the decoded data. This Map<String, Object>
        // will hold a map of strings to arbitrary data types.
        Map<String, Object> dat = mapper.readValue(byt, Map.class);
        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");
        System.out.println(num);

        // Accessing nested data requires a series of casts.
        List<String> strs = (List<String>) dat.get("strs");
        String str1 = 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 casts when accessing the decoded data.
        String str = "{\"page\": 1, \"fruits\": [\"apple\", \"peach\"]}";
        Response2 res = mapper.readValue(str, Response2.class);
        System.out.println(res.page);
        System.out.println(res.fruits.get(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.
        mapper.writeValue(System.out, mapD);
    }
}

To run this program, you’ll need to include the Jackson library in your project. You can add it to your project using Maven or download the JAR files directly.

When you run this program, you should see output similar to the following:

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 Jackson library documentation for more advanced features and options.