@@ -64,32 +64,36 @@ local function encode_table(val, stack)
64
64
if stack [val ] then error (" circular reference" ) end
65
65
66
66
stack [val ] = true
67
+ -- Check whether to treat as a array or object
68
+ local array = true
69
+ local length = 0
70
+ for k in pairs (val ) do
71
+ if type (k ) ~= " number" or k <= 0 then
72
+ array = nil
73
+ break -- Treat as object
74
+ else
75
+ if k > length then
76
+ length = k
77
+ end
78
+ end
79
+ end
67
80
68
- if rawget (val , 1 ) ~= nil or next (val ) == nil then
69
- -- Treat as array -- check keys are valid and it is not sparse
70
- local n = 0
71
- for k in pairs (val ) do
72
- if type (k ) ~= " number" then
73
- error (" invalid table: mixed or invalid key types" )
74
- end
75
- n = n + 1
76
- end
77
- if n ~= # val then
78
- error (" invalid table: sparse array" )
79
- end
81
+ if array then
80
82
-- Encode
81
- for i , v in ipairs ( val ) do
82
- table.insert (res , encode (v , stack ))
83
+ for i = 1 , length do
84
+ table.insert (res , encode (val [ i ] , stack ))
83
85
end
84
86
stack [val ] = nil
85
87
return " [" .. table.concat (res , " ," ) .. " ]"
86
88
87
89
else
88
90
-- Treat as an object
89
91
for k , v in pairs (val ) do
92
+ --[[
90
93
if type(k) ~= "string" then
91
94
error("invalid table: mixed or invalid key types")
92
95
end
96
+ ]]
93
97
table.insert (res , encode (k , stack ) .. " :" .. encode (v , stack ))
94
98
end
95
99
stack [val ] = nil
@@ -108,7 +112,7 @@ local function encode_number(val)
108
112
if val ~= val or val <= - math.huge or val >= math.huge then
109
113
error (" unexpected number value '" .. tostring (val ) .. " '" )
110
114
end
111
- return string.format ( " %.14g " , val )
115
+ return tostring ( val )
112
116
end
113
117
114
118
0 commit comments