webmcp

annotate framework/env/encode/json.lua @ 8:f02e14d1e69e

Bugfix: Negative offset when paginating empty result set
author jbe
date Sun Jan 31 18:36:35 2010 +0100 (2010-01-31)
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

Impressum / About Us