
// ReadJson.java
// https://www.digitalocean.com/community/tutorials/json-simple-example
// Modified by Andrew Davison, ad@coe.psu.ac.th, July 2023

/* Illustrates how to read JSON data (from data.json)
   using the Json-simple library
   (https://github.com/cliftonlabs/json-simple).
   No use is made of Apache Velocity. For JSON + Velocity, see
   UseJsonTool.java and GenJSON.java.

   Usage:
    > compile ReadJson.java
    > run ReadJson
*/

import java.io.*;
import java.util.*;
import java.math.*;

import com.github.cliftonlabs.json_simple.*;


public class ReadJson
{
  private static final String JSON_FNM = "data.json";


  public static void main(String[] args) 
                                   throws Exception
  {
    System.out.println("Loading JSON from " + JSON_FNM);
    Reader reader = new FileReader(JSON_FNM);
    JsonObject jsonObject = 
                     (JsonObject) Jsoner.deserialize(reader);
    reader.close();

    String name = (String) jsonObject.get("name");
    System.out.println("Name = " + name);

    BigDecimal age = (BigDecimal) jsonObject.get("age");
    System.out.println("Age = " + age);

    JsonArray cities = (JsonArray) jsonObject.get("cities");
    List<String> citiesList = new ArrayList<>();
    cities.asCollection(citiesList);
    for (String city : citiesList)
      System.out.println("City = " + city);

    System.out.println("--------------------");
    traverse("", jsonObject);
  } /* main */



  private static void traverse(String prevKey, JsonObject obj) 
  /* based on code from
     https://stackoverflow.com/questions/70681496/
         java-using-jsonobject-to-loop-recursive-through-any-jsondata
  */
  {
    for (String currKey : obj.keySet()) {
      String nextKey = 
         (prevKey == null || prevKey.isEmpty()) ? 
                    currKey : (prevKey + "-" + currKey);
      Object value = obj.get(currKey);
      if (value instanceof JsonObject) {
        traverse(nextKey, (JsonObject) value);
      } 
      else if (value instanceof JsonArray) {
        JsonArray arr = (JsonArray) value;
        for (int i = 0; i < arr.size(); i++) {
          Object object = arr.get(i);
          if (object instanceof JsonObject) {
            JsonObject jsonObject = (JsonObject) object;
            traverse(nextKey + "." + i, jsonObject);
          } 
          else
            System.out.println(nextKey + ": " + object);
        }
      } 
      else
        System.out.println(nextKey + ": " + value);
    }
  }  // end of traverse()


}  // end of ReadJson class