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
|