/* * Created by PyramIDE. * User: ricard * Date: 18/08/2008 * Time: 08:12 * * */ 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 _format_json(json_lib, json), // 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)).