jbe/bsw@0: --[[-- jbe/bsw@0: json_string = -- JavaScript code representing the given datum (with quotes, if needed) jbe/bsw@0: encode.json( jbe/bsw@0: obj -- true, false, nil or a number or string jbe/bsw@0: ) jbe/bsw@0: jbe/bsw@0: This function encodes any native datatype or atom in JavaScript object notation (JSON). jbe/bsw@0: jbe/bsw@0: --]]-- jbe/bsw@0: jbe/bsw@0: function encode.json(obj) jbe/bsw@0: if obj == nil then jbe/bsw@0: return "null"; jbe/bsw@0: elseif atom.has_type(obj, atom.boolean) then jbe/bsw@0: return tostring(obj) jbe/bsw@0: elseif atom.has_type(obj, atom.number) then jbe/bsw@0: return tostring(obj) jbe/bsw@0: else jbe/bsw@0: return jbe/bsw@0: "'" .. jbe/bsw@0: string.gsub(atom.dump(obj), ".", jbe/bsw@0: function (char) jbe/bsw@0: if char == "\r" then return "\\r" end jbe/bsw@0: if char == "\n" then return "\\n" end jbe/bsw@0: if char == "\\" then return "\\\\" end jbe/bsw@0: if char == "'" then return "\\'" end jbe/bsw@0: if char == "/" then return "\\/" end -- allowed according to RFC4627, needed for jbe/bsw@0: local byte = string.byte(char) jbe/bsw@0: if byte < 32 then return string.format("\\u%04x", byte) end jbe/bsw@0: end jbe/bsw@0: ) .. jbe/bsw@0: "'" jbe/bsw@0: end jbe/bsw@0: end