luci-base: switch to luci-lib-jsonc
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 20 Nov 2015 23:29:55 +0000 (00:29 +0100)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 20 Nov 2015 23:29:55 +0000 (00:29 +0100)
Add dependency on luci-lib-jsonc and use it to
reimplement luci.util.serialize_json().

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
modules/luci-base/Makefile
modules/luci-base/luasrc/util.lua

index 54506b0..26cbe08 100644 (file)
@@ -12,7 +12,7 @@ LUCI_TYPE:=mod
 LUCI_BASENAME:=base
 
 LUCI_TITLE:=LuCI core libraries
-LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua
+LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc
 
 PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
 PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files
index dcf8230..787bc66 100644 (file)
@@ -9,6 +9,7 @@ local ldebug = require "luci.debug"
 local string = require "string"
 local coroutine = require "coroutine"
 local tparser = require "luci.template.parser"
+local json = require "luci.jsonc"
 
 local _ubus = require "ubus"
 local _ubus_connection = nil
@@ -600,55 +601,11 @@ function ubus(object, method, data)
 end
 
 function serialize_json(x, cb)
-       local rv, push = nil, cb
-       if not push then
-               rv = { }
-               push = function(tok) rv[#rv+1] = tok end
-       end
-
-       if x == nil then
-               push("null")
-       elseif type(x) == "table" then
-               -- test if table is array like
-               local k, v
-               local n1, n2 = 0, 0
-               for k in pairs(x) do n1 = n1 + 1 end
-               for k in ipairs(x) do n2 = n2 + 1 end
-
-               if n1 == n2 and n1 > 0 then
-                       push("[")
-                       for k = 1, n2 do
-                               if k > 1 then
-                                       push(",")
-                               end
-                               serialize_json(x[k], push)
-                       end
-                       push("]")
-               else
-                       push("{")
-                       for k, v in pairs(x) do
-                               push("%q:" % tostring(k))
-                               serialize_json(v, push)
-                               if next(x, k) then
-                                       push(",")
-                               end
-                       end
-                       push("}")
-               end
-       elseif type(x) == "number" or type(x) == "boolean" then
-               if (x ~= x) then
-                       -- NaN is the only value that doesn't equal to itself.
-                       push("Number.NaN")
-               else
-                       push(tostring(x))
-               end
+       local js = json.stringify(x)
+       if type(cb) == "function" then
+               cb(js)
        else
-               push('"%s"' % tostring(x):gsub('["%z\1-\31\\]',
-                       function(c) return '\\u%04x' % c:byte(1) end))
-       end
-
-       if not cb then
-               return table.concat(rv, "")
+               return js
        end
 end