content: -- credit to Alex Morega: https://github.com/mgax/applescript-json
  
  on encode(value)
    set type to class of value
    if type = integer or type = boolean
      return value as text
    else if type = text
      return encodeString(value)
    else if type = list
      return encodeList(value)
    else if type = script
      return value's toJson()
    else
      error "Unknown type " & type
    end
  end
  
  
  on encodeList(value_list)
    set out_list to {}
    repeat with value in value_list
      copy encode(value) to end of out_list
    end
    return "[" & join(out_list, ", ") & "]"
  end
  
  
  on encodeString(value)
    set rv to ""
    set codepoints to id of value
  
    if (class of codepoints) is not list
      set codepoints to {codepoints}
    end
  
    repeat with codepoint in codepoints
      set codepoint to codepoint as integer
      if codepoint = 34
        set quoted_ch to "\\\""
      else if codepoint = 92 then
        set quoted_ch to "\\\\"
      else if codepoint >= 32 and codepoint < 127
        set quoted_ch to character id codepoint
      else
        set quoted_ch to "\\u" & hex4(codepoint)
      end
      set rv to rv & quoted_ch
    end
    return "\"" & rv & "\""
  end
  
  
  on join(value_list, delimiter)
    set original_delimiter to AppleScript's text item delimiters
    set AppleScript's text item delimiters to delimiter
    set rv to value_list as text
    set AppleScript's text item delimiters to original_delimiter
    return rv
  end
  
  
  on hex4(n)
    set digit_list to "0123456789abcdef"
    set rv to ""
    repeat until length of rv = 4
      set digit to (n mod 16)
      set n to (n - digit) / 16 as integer
      set rv to (character (1+digit) of digit_list) & rv
    end
    return rv
  end
  
  
  on createDictWith(item_pairs)
    set item_list to {}
  
    script Dict
      on setkv(key, value)
        copy {key, value} to end of item_list
      end
  
      on toJson()
        set item_strings to {}
        repeat with kv in item_list
          set key_str to encodeString(item 1 of kv)
          set value_str to encode(item 2 of kv)
          copy key_str & ": " & value_str to end of item_strings
        end
        return "{" & join(item_strings, ", ") & "}"
      end
    end
  
    repeat with pair in item_pairs
      Dict's setkv(item 1 of pair, item 2 of pair)
    end
  
    return Dict
  end
  
  
  on createDict()
    return createDictWith({})
  end
  