CXM_json.anubis 3.37 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

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).

//-------------------------------
// 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,
    [h . t] then
      if (h >=+ 32 & h +=< 33) | (h >=+ 35 & h +=< 38) | (h >=+ 40 & h +=< 91) | h >=+ 93 then  // Allowed characters for JSON see RFC4627 + " ' "
        _format_json_esc(t, [h . new_string])
      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
  format_json_member
  (
    JsonMember member
  ) =
  if member is json_member(name, value) then
  [ "'", name, "':" . format_json(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_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
  (
    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", [])
  }.