- 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