webmcp
annotate framework/env/encode/json.lua @ 1:985024b16520
Version 1.0.1
New feature: JSON requests
Changes in ui.paginate: Current page setting is directly fetched from CGI params, instead of view params
Changed behavior of load methods of atom library to accept nil as input
Bugfixes in mondelefant_atom_connector timestamp(tz) loaders
Added global constant _WEBMCP_VERSION containing a version string
New feature: JSON requests
Changes in ui.paginate: Current page setting is directly fetched from CGI params, instead of view params
Changed behavior of load methods of atom library to accept nil as input
Bugfixes in mondelefant_atom_connector timestamp(tz) loaders
Added global constant _WEBMCP_VERSION containing a version string
author | jbe |
---|---|
date | Tue Nov 17 12:00:00 2009 +0100 (2009-11-17) |
parents | 9fdfb27f8e67 |
children | e017c47d43b5 |
rev | line source |
---|---|
jbe/bsw@0 | 1 --[[-- |
jbe/bsw@0 | 2 json_string = -- JavaScript code representing the given datum (with quotes, if needed) |
jbe/bsw@0 | 3 encode.json( |
jbe/bsw@0 | 4 obj -- true, false, nil or a number or string |
jbe/bsw@0 | 5 ) |
jbe/bsw@0 | 6 |
jbe/bsw@0 | 7 This function encodes any native datatype or atom in JavaScript object notation (JSON). |
jbe@1 | 8 TODO: can't distinguish unambiguously between empty object and empty list! |
jbe/bsw@0 | 9 |
jbe/bsw@0 | 10 --]]-- |
jbe/bsw@0 | 11 |
jbe@1 | 12 -- TODO: check if numeric representations are JSON compatible |
jbe@1 | 13 |
jbe/bsw@0 | 14 function encode.json(obj) |
jbe/bsw@0 | 15 if obj == nil then |
jbe/bsw@0 | 16 return "null"; |
jbe/bsw@0 | 17 elseif atom.has_type(obj, atom.boolean) then |
jbe/bsw@0 | 18 return tostring(obj) |
jbe/bsw@0 | 19 elseif atom.has_type(obj, atom.number) then |
jbe/bsw@0 | 20 return tostring(obj) |
jbe@1 | 21 elseif type(obj) == "table" then |
jbe@1 | 22 local parts = {} |
jbe@1 | 23 local first = true |
jbe@1 | 24 if #obj > 0 then |
jbe@1 | 25 parts[#parts+1] = "[" |
jbe@1 | 26 for idx, value in ipairs(obj) do |
jbe@1 | 27 if first then |
jbe@1 | 28 first = false |
jbe@1 | 29 else |
jbe@1 | 30 parts[#parts+1] = "," |
jbe@1 | 31 end |
jbe@1 | 32 parts[#parts+1] = tostring(value) |
jbe@1 | 33 end |
jbe@1 | 34 parts[#parts+1] = "]" |
jbe@1 | 35 else |
jbe@1 | 36 parts[#parts+1] = "{" |
jbe@1 | 37 for key, value in pairs(obj) do |
jbe@1 | 38 if first then |
jbe@1 | 39 first = false |
jbe@1 | 40 else |
jbe@1 | 41 parts[#parts+1] = "," |
jbe@1 | 42 end |
jbe@1 | 43 parts[#parts+1] = encode.json(key) |
jbe@1 | 44 parts[#parts+1] = ":" |
jbe@1 | 45 parts[#parts+1] = encode.json(value) |
jbe@1 | 46 end |
jbe@1 | 47 parts[#parts+1] = "}" |
jbe@1 | 48 end |
jbe@1 | 49 return table.concat(parts) |
jbe/bsw@0 | 50 else |
jbe/bsw@0 | 51 return |
jbe@1 | 52 '"' .. |
jbe/bsw@0 | 53 string.gsub(atom.dump(obj), ".", |
jbe/bsw@0 | 54 function (char) |
jbe@1 | 55 if char == '\r' then return '\\r' end |
jbe@1 | 56 if char == '\n' then return '\\n' end |
jbe@1 | 57 if char == '\\' then return '\\\\' end |
jbe@1 | 58 if char == '"' then return '\\"' end |
jbe@1 | 59 if char == '/' then return '\\/' end -- allowed according to RFC4627, needed for </script> |
jbe/bsw@0 | 60 local byte = string.byte(char) |
jbe/bsw@0 | 61 if byte < 32 then return string.format("\\u%04x", byte) end |
jbe/bsw@0 | 62 end |
jbe/bsw@0 | 63 ) .. |
jbe@1 | 64 '"' |
jbe/bsw@0 | 65 end |
jbe/bsw@0 | 66 end |