CXM_json.anubis 6.88 KB
/*
 * Created by PyramIDE.
 * User: ricard
 * Date: 18/08/2008
 * Time: 08:12
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */

read tools/basis.anubis
read tools/printable_tree.anubis
transmit web/mime.anubis

transmit calexium_lib/extensions/json.anubis

public type JsonMember:...


public type JsonValue:
  json_object(List(JsonMember)),
  json_array(List(JsonValue)),
  json_int(Int  value),
  json_float(Float value, Int precision),
  json_string(String value),
  json_bool(Bool value),
  json_null.


public type JsonMember:
  json_member(String    name,
              JsonValue value).

public define Printable_tree
  _format_json
  (
    JsonValue json
  ).

public define Printable_tree
  _format_json
  (
    Library   json_lib,
    JsonValue json
  ).  
//-------------------------------
// helpers

public define JsonMember
  json_member
  (
    String            name,
    List(JsonMember)  value,
  ) =
  json_member(name, json_object(value)).


public define JsonMember
  json_member
  (
    String            name,
    List(JsonValue)   value,
  ) =
  json_member(name, json_array(value)).

public define JsonMember
  json_member
  (
    String  name,
    Int     value,
  ) =
  json_member(name, json_int(value)).

public define JsonMember
  json_member
  (
    String  name,
    Float   value,
    Int     precision,
  ) =
  json_member(name, json_float(value, precision)).

public define JsonMember
  json_member
  (
    String  name,
    String  value,
  ) =
  json_member(name, json_string(value)).

public define JsonMember
  json_member
  (
    String  name,
    Bool    value,
  ) =
  json_member(name, json_bool(value)).

public define JsonMember
  json_null
  (
    String            name,
  ) =
  json_member(name, json_null).

//-------------------------------------------
// Outputing Json to Printable_tree

define List(Word8)
  _format_json_esc
  (
    List(Word8) original,
    List(Word8) new_string,
  ) =
  if original is
  {
    []      then ['\"' . new_string], //add trailing double quotes
    [h . t] then
      if (h >=+ 32 & h +=< 33) | (h >=+ 35 & h +=< 91) | h >=+ 93 then  // Allowed characters for JSON see RFC4627 + " ' " Why ' ???
        _format_json_esc(t, [h . new_string])
      else if h = '\n' then _format_json_esc(t, ['n', '\\' . new_string])
      else if h = '\r' then _format_json_esc(t, ['r', '\\' . new_string])
      else if h = '\t' then _format_json_esc(t, ['t', '\\' . new_string])
      else if h = 0x08 then _format_json_esc(t, ['b', '\\' . new_string])   //Backspace
      else _format_json_esc(t, [h, '\\' . new_string])
 }.

public define String
  format_json_esc
  (
    String original,
  ) =
  implode(reverse(_format_json_esc(explode(original), ['\"'],))).


public define Printable_tree
  format_json
  (
    JsonValue json
  ).

public define Printable_tree
  to_javascript
  (
    JsonValue json
  ).

public define Printable_tree
  format_json_member
  (
    JsonMember member
  ) =
  if member is json_member(name, value) then
  [ "\"", name, "\":" . _format_json(value) ].

public define Printable_tree
  format_json_member
  (
    Library    json_lib,
    JsonMember member
  ) =
  if member is json_member(name, value) then
  [ "\"", name, "\":" . _format_json(json_lib, value) ].
  
public define Printable_tree
  json_member_to_js
  (
    JsonMember member
  ) =
  if member is json_member(name, value) then
  [ "\"", name, "\":" . to_javascript(value) ].

define Printable_tree
  format_json_object
  (
    List(JsonMember)  members
  ) =
  if members is
  {
    [] then [],
    [h . t] then [ format_json_member(h), (if t is [] then "" else ",") . format_json_object(t) ]
  }.
  
define Printable_tree
  format_json_object
  (
    Library           json_lib,
    List(JsonMember)  members
  ) =
  if members is
  {
    [] then [],
    [h . t] then [ format_json_member(json_lib, h), (if t is [] then "" else ",") . format_json_object(json_lib, t) ]
  }.

define Printable_tree
  json_object_to_js
  (
    List(JsonMember) members
  ) =
  if members is
  {
    [] then [],
    [h . t] then [ json_member_to_js(h), (if t is [] then "" else ",") . json_object_to_js(t) ]
  }.

define Printable_tree
  format_json_array
  (
    Library         json_lib,
    List(JsonValue) values
  ) =
  if values is
  {
    []      then [],
    [h . t] then [ _format_json(json_lib, h), (if t is [] then "" else ",") . format_json_array(json_lib, t) ]
  }.

define Printable_tree
  format_json_array
  (
    List(JsonValue) values
  ) =
  if values is
  {
    [] then [],
    [h . t] then [ _format_json(h), (if t is [] then "" else ",") . format_json_array(t) ]
  }.

public define Printable_tree
  _format_json
  (
    Library   json_lib,
    JsonValue json
  ) =
  if json is
  {
    json_object(members)  then [ "{", format_json_object(json_lib, members), "}" . [] ],
    json_array(values)    then [ "[", format_json_array(json_lib, values), "]" . [] ],
    json_int(i)           then int_pt(i, []),
    json_float(f, p)      then str_pt(float_to_string(f, p), []),
    json_string(s)        then if s ="" then str_pt("\"\"", []) else str_pt(to_JSON_String(json_lib, s), []),
    json_bool(b)          then str_pt(if b then "true" else "false", []),
    json_null             then str_pt("null", [])
  }.

public define Printable_tree
  _format_json
  (
    JsonValue json
  ) =
  if json is
  {
    json_object(members)  then [ "{", format_json_object(members), "}" . [] ],
    json_array(values)    then [ "[", format_json_array(values), "]" . [] ],
    json_int(i)           then int_pt(i, []),
    json_float(f, p)      then str_pt(float_to_string(f, p), []),
    json_string(s)        then str_pt(format_json_esc(s), []),
    json_bool(b)          then str_pt(if b then "true" else "false", []),
    json_null             then str_pt("null", [])
  }.
  
public define Printable_tree
  format_json
  (
    JsonValue json
  ) =
  //try to use adl version of json escape string
  if load_library("json") is
  {
    error(err)  then
      println("load lib error:");
      println("--> can't load extension lib. Hence use anubis version");
      _format_json(json)
    ok(json_lib)  then
        with start = unow,
        result = _format_json(json_lib, json),
        println(show_duration_string("format_json with extension ",start));
        result
  }.
  
public define String
  to_JSON_String
  (
    String str
  ) =
  //try to use adl version of json escape string
  if load_library("json") is
  {
    error(err)  then
      println("load lib error:");
      println("--> can't load extension lib. Hence use anubis version");
      format_json_esc(str)
    ok(json_lib)  then
      to_JSON_String(json_lib, str)
  }.

public define String
  format_json
  (
    JsonValue json
  ) =
  to_String(format_json(json)).


public define WriteFileResult
  write_to_file
  (
    String    filename, //filename where the JSON will be dump
    JsonValue json      //JSON to dump
  )=
  write_to_file(filename, format_json(json)).