Json in Java

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
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 {
        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 IOException {
        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 lists 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 package can automatically encode your
        // custom data types.
        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 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();
        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
        // 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 the Jackson
        // package 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 Java classes.
        // 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 or OutputStream objects.
        mapper.writeValue(System.out, mapD);
    }
}

This Java code demonstrates JSON encoding and decoding using the Jackson library, which is a popular choice for JSON processing in Java. The code covers similar concepts to the original Go example, including:

  1. Encoding basic data types to JSON
  2. Encoding lists and maps to JSON
  3. Encoding custom objects to JSON
  4. Using annotations to customize JSON field names
  5. Decoding JSON into maps and custom objects
  6. Handling nested JSON structures

To run this code, you’ll need to include the Jackson library in your project. You can do this by adding the following dependency to your Maven pom.xml file:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.5</version>
</dependency>

Or if you’re using Gradle, add this to your build.gradle file:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.5'

Remember to handle the IOException that may be thrown during JSON processing. In this example, we’ve declared that the main method throws IOException for simplicity, but in a real application, you’d want to handle these exceptions more gracefully.