/* * 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 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 +=< 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 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 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 ( List(JsonValue) values ) = if values is { [] then [], [h . t] then [ format_json(h), (if t is [] then "" else ",") . format_json_array(t) ] }. define Printable_tree json_array_to_js ( List(JsonValue) values ) = if values is { [] then [], [h . t] then [ to_javascript(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", []) }. public define Printable_tree to_javascript ( JsonValue json ) = if json is { json_object(members) then [ "{", json_object_to_js(members), "}" . [] ], json_array(values) then [ "[", json_array_to_js(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 String format_json ( JsonValue json ) = to_String(format_json(json)). public define String to_javascript ( JsonValue json ) = to_String(to_javascript(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)).