Load a JSON string into a data structure.
Also, create a new data structure and serialize it into JSON.

Use objects and arrays (as appropriate for your language)
and make sure your JSON is valid (https://jsonformatter.org).

/* NetRexx */
options replace format comments java crossref symbols nobinary
 
import java.util.List
import org.json.JSONObject
import org.json.JSONArray
import org.json.JSONTokener
import org.json.JSONException
 
/**
 * Using library from json.org 
 *
 * @see http://www.json.org/java/index.html
 */
class RJson01 public
 
  properties private constant
    JSON_DWARFS = '' -
      '{\n' -
      '  "F1937_1" : {\n' -
      '    "title"  : "Snow White and the Seven Dwarfs",\n' -
      '    "year"   : 1937,\n' -
      '    "medium" : "film",\n' -
      '    "dwarfs" : [ "Grumpy", "Happy", "Sleepy", "Bashful", "Sneezy", "Dopey", "Doc" ]\n' -
      '  },\n' -
      '  "F2012_1" : {\n' -
      '    "title"  : "Mirror, Mirror",\n' -
      '    "year"   : 2012,\n' -
      '    "medium" : "film",\n' -
      '    "dwarfs" : [ "Grimm", "Butcher", "Wolf", "Napoleon", "Half Pint", "Grub", "Chuckles" ]\n' -
      '  },\n' -
      '}'
 
      /**
       * A bean that looks like the following JSON
       * <pre>
       * {
       *   "F2012_2" : {
       *     "title"  : "Snow White & the Huntsman",
       *     "year"   : 2012, 
       *     "medium" : "film",
       *     "dwarfs" : [ "Beith", "Quert", "Muir", "Coll", "Duir", "Gus", "Gort", "Nion" ]
       *   }
       * }
       * </pre>
       */
      SAMPLE_BEAN = DwarfBean( -
        "F2012_2", -
        "Snow White & the Huntsman", -
        Long(2012), -
        "film", -
        Arrays.asList([String "Beith", "Quert", "Muir", "Coll", "Duir", "Gus", "Gort", "Nion"]) -
        )
 
  method main(args = String[]) public static
    say json2bean(JSON_DWARFS)
    say
    say bean2json(SAMPLE_BEAN)
    say
    return
 
method json2bean(dwarfs) public static returns List
    say "Make beans from this JSON string:"
    say dwarfs
    jsonBeans = ArrayList()
    do
      jd = JSONObject(JSONTokener(dwarfs))
      ns = JSONObject.getNames(jd)
      name = String
      loop name over ns
        dwarves = ArrayList()
        jn      = jd.getJSONObject(name)
        title   = jn.getString('title')
        year    = Long(jn.getLong('year'))
        medium  = jn.getString('medium')
        dwa     = jn.getJSONArray('dwarfs')
        loop di = 0 to dwa.length() - 1
          dwarves.add(dwa.getString(di))
          end di
        jb = DwarfBean(name, title, year, medium, dwarves)
        jsonBeans.add(jb.toString())
        end name
    catch ex = JSONException
      ex.printStackTrace()
    end
  return jsonBeans
 
method bean2json(sb = DwarfBean) public static returns String
  say "Make JSONObject from this bean:"
  say sb
  jsonString = String
  do
    jd = JSONObject(sb)
    jo = JSONObject()
    jo = jo.put(sb.keyGet(), jd)
    jsonString = jo.toString(2)
  catch ex = JSONException
    ex.printStackTrace()
  end
  return jsonString
 
-- =============================================================================
class RJson01.DwarfBean public binary
  properties private
    key    = String -- not part of bean
  properties indirect
    title  = String
    year   = Long
    medium = String
    dwarfs = List
 
  method DwarfBean(key_ = String null, title_ = String null, year_ = Long null, medium_ = String null, dwarfs_ = List null) public
    keyPut(key_)
    setTitle(title_)
    setYear(year_)
    setMedium(medium_)
    setDwarfs(dwarfs_)
    return
 
  method keyPut(key_ = String) public
    key = key_
    return
 
  method keyGet() returns String
    return key
 
  method toString public returns String
    ts = StringBuilder()
    ts.append(String.format("%s@%08x ", [Object this.getClass().getSimpleName(), Integer(hashCode())]))
    ts.append('[')
    ts.append('key='String.valueOf(keyGet())', ')
    ts.append('title='String.valueOf(getTitle())', ')
    ts.append('year='String.valueOf(getYear())', ')
    ts.append('medium='String.valueOf(getMedium())', ')
    ts.append('dwarfs='String.valueOf(getDwarfs()))
    ts.append(']')
    return ts.toString()
 