Merge pull request #6 from alexandro-rezakhani/alexandro-rezakhani-patch-1

Update json.lua
pull/44/head
alexandro-rezakhani 2022-11-20 00:28:22 -05:00 committed by GitHub
commit cd2b736e8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 42 additions and 38 deletions

View File

@ -55,6 +55,7 @@ local function encode_nil(val)
return "null" return "null"
end end
local json_object_tag = {}
local function encode_table(val, stack) local function encode_table(val, stack)
local res = {} local res = {}
@ -64,47 +65,50 @@ local function encode_table(val, stack)
if stack[val] then error("circular reference") end if stack[val] then error("circular reference") end
stack[val] = true stack[val] = true
-- Check whether to treat as a array or object
local array = true
local length = 0
local nLen = 0
for k,v in pairs(val) do
if (type(k) ~= "number" or k<=0) and not (k == "n" and type(v) == "number") then
array = nil
break -- Treat as object
else
if k > length then
length = k
end
if k == "n" and type(v) == "number" then
nLen = v
end
end
end
if array then if getmetatable(val) ~= json_object_tag and (rawget(val, 1) ~= nil or next(val) == nil) then
if nLen > length then -- Check whether to treat as a array or object
length = nLen local array = true
end local length = 0
-- Encode local nLen = 0
for i=1,length do for k,v in pairs(val) do
table.insert(res, encode(val[i], stack)) if (type(k) ~= "number" or k<=0) and not (k == "n" and type(v) == "number") then
end array = nil
stack[val] = nil break -- Treat as object
return "[" .. table.concat(res, ",") .. "]" else
if k > length then
else length = k
-- Treat as an object end
for k, v in pairs(val) do if k == "n" and type(v) == "number" then
--[[ nLen = v
if type(k) ~= "string" then end
error("invalid table: mixed or invalid key types")
end end
]]
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
end end
stack[val] = nil if array then
return "{" .. table.concat(res, ",") .. "}" if nLen > length then
length = nLen
end
-- Encode
for i=1,length do
table.insert(res, encode(val[i], stack))
end
stack[val] = nil
return "[" .. table.concat(res, ",") .. "]"
else
-- Treat as an object
for k, v in pairs(val) do
--[[
if type(k) ~= "string" then
error("invalid table: mixed or invalid key types")
end
]]
if k ~= "_" then
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
end
end
stack[val] = nil
return "{" .. table.concat(res, ",") .. "}"
end
end end
end end