webmcp
annotate framework/env/encode/json.lua @ 2:72860d232f32
Version 1.0.2
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
author | jbe/bsw |
---|---|
date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
parents | 985024b16520 |
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 |