aboutsummaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2012-01-18 15:08:05 +0000
committerMatthew Wild <mwild1@gmail.com>2012-01-18 15:08:05 +0000
commit15517ffb459eec36ebca7f4a783d0b0a13c5794e (patch)
tree6447d41c94f28fbdab206e8ec5b2866d0700b083 /util
parent8366c1b7339b6b10ebe43009c9f78dd1b1718335 (diff)
parentd79def083bd4f80242ada7e98f4c24d85787305f (diff)
downloadprosody-15517ffb459eec36ebca7f4a783d0b0a13c5794e.tar.gz
prosody-15517ffb459eec36ebca7f4a783d0b0a13c5794e.zip
Merge with trunk
Diffstat (limited to 'util')
-rw-r--r--util/json.lua31
1 files changed, 25 insertions, 6 deletions
diff --git a/util/json.lua b/util/json.lua
index 5d0b0876..efc602f0 100644
--- a/util/json.lua
+++ b/util/json.lua
@@ -1,6 +1,6 @@
local type = type;
-local t_insert, t_concat, t_remove = table.insert, table.concat, table.remove;
+local t_insert, t_concat, t_remove, t_sort = table.insert, table.concat, table.remove, table.sort;
local s_char = string.char;
local tostring, tonumber = tostring, tonumber;
local pairs, ipairs = pairs, ipairs;
@@ -79,11 +79,25 @@ function tablesave(o, buffer)
if next(__hash) ~= nil or next(hash) ~= nil or next(__array) == nil then
t_insert(buffer, "{");
local mark = #buffer;
- for k,v in pairs(hash) do
- stringsave(k, buffer);
- t_insert(buffer, ":");
- simplesave(v, buffer);
- t_insert(buffer, ",");
+ if buffer.ordered then
+ local keys = {};
+ for k in pairs(hash) do
+ t_insert(keys, k);
+ end
+ t_sort(keys);
+ for _,k in ipairs(keys) do
+ stringsave(k, buffer);
+ t_insert(buffer, ":");
+ simplesave(hash[k], buffer);
+ t_insert(buffer, ",");
+ end
+ else
+ for k,v in pairs(hash) do
+ stringsave(k, buffer);
+ t_insert(buffer, ":");
+ simplesave(v, buffer);
+ t_insert(buffer, ",");
+ end
end
if next(__hash) ~= nil then
t_insert(buffer, "\"__hash\":[");
@@ -129,6 +143,11 @@ function json.encode(obj)
simplesave(obj, t);
return t_concat(t);
end
+function json.encode_ordered(obj)
+ local t = { ordered = true };
+ simplesave(obj, t);
+ return t_concat(t);
+end
-----------------------------------