Comparison

util/json.lua @ 5516:9733836629f9

util.json: Make encode(decode("[]"))=="[]".
author Waqas Hussain <waqas20@gmail.com>
date Tue, 23 Apr 2013 14:41:52 -0400
parent 5436:a4ba5819bf50
child 5517:9d7349bbe4d2
comparison
equal deleted inserted replaced
5514:1091d7c3b4d2 5516:9733836629f9
15 local pairs, ipairs = pairs, ipairs; 15 local pairs, ipairs = pairs, ipairs;
16 local next = next; 16 local next = next;
17 local error = error; 17 local error = error;
18 local newproxy, getmetatable = newproxy, getmetatable; 18 local newproxy, getmetatable = newproxy, getmetatable;
19 local print = print; 19 local print = print;
20
21 local has_array, array = pcall(require, "util.array");
22 local array_mt = hasarray and getmetatable(array()) or {};
20 23
21 --module("json") 24 --module("json")
22 local json = {}; 25 local json = {};
23 26
24 local null = newproxy and newproxy(true) or {}; 27 local null = newproxy and newproxy(true) or {};
163 if t == "number" then 166 if t == "number" then
164 t_insert(buffer, tostring(o)); 167 t_insert(buffer, tostring(o));
165 elseif t == "string" then 168 elseif t == "string" then
166 stringsave(o, buffer); 169 stringsave(o, buffer);
167 elseif t == "table" then 170 elseif t == "table" then
168 tablesave(o, buffer); 171 local mt = getmetatable(o);
172 if mt == array_mt then
173 arraysave(o, buffer);
174 else
175 tablesave(o, buffer);
176 end
169 elseif t == "boolean" then 177 elseif t == "boolean" then
170 t_insert(buffer, (o and "true" or "false")); 178 t_insert(buffer, (o and "true" or "false"));
171 else 179 else
172 t_insert(buffer, "null"); 180 t_insert(buffer, "null");
173 end 181 end
235 end 243 end
236 end 244 end
237 245
238 local readvalue; 246 local readvalue;
239 local function readarray() 247 local function readarray()
240 local t = {}; 248 local t = setmetatable({}, array_mt);
241 next(); -- skip '[' 249 next(); -- skip '['
242 skipstuff(); 250 skipstuff();
243 if ch == "]" then next(); return t; end 251 if ch == "]" then next(); return t; end
244 t_insert(t, readvalue()); 252 t_insert(t, readvalue());
245 while true do 253 while true do