RosettaCodeData/Task/JSON/Lingo/json-2.lingo

51 lines
1.3 KiB
Plaintext

----------------------------------------
-- JSON encoder
-- Supported Lingo data types: VOID, integer, float, string, symbol, list, propList
-- @param {any} o
-- @return {string}
----------------------------------------
on json_encode (o)
case ilk(o) of
#void:
return "null"
#integer, #float:
return string(o)
#string:
return QUOTE & _json_escape_string(o) & QUOTE
#list:
res = []
repeat with v in o
res.add(json_encode(v))
end repeat
return "[" & _cimplode(res) & "]"
#propList:
res = []
cnt = count(o)
repeat with i = 1 to cnt
p = o.getPropAt(i)
v = o[i]
res.add( json_encode(p)&":"&json_encode(v) )
end repeat
return "{" & _cimplode(res) & "}"
#symbol:
-- optional support of special Lingo data type 'symbol' unknown to JavaScript
return QUOTE &"__sym__"&_json_escape_string(string(o)) & QUOTE
otherwise:
put "ERROR: unsupported data type"
end case
end
----------------------------------------
-- Implodes list into comma-separated string
-- @param {list} l
-- @return {string}
----------------------------------------
on _cimplode (l)
str=""
repeat with i=1 to l.count
put l[i]&"," after str
end repeat
delete the last char of str
return str
end