diff options
author | Matthew Wild <mwild1@gmail.com> | 2022-11-04 12:26:43 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2022-11-04 12:26:43 +0000 |
commit | 76bf6d511f851c7cde8a81257afaaae0fb7a4160 (patch) | |
tree | 41b09447349d473423b72b1ff6446639d2fdd2ba | |
parent | e817ec013c396916007f1269c927d4634bddb6fe (diff) | |
parent | d4daf40caa518a89e51222e6e1d9c230db02839a (diff) | |
download | prosody-76bf6d511f851c7cde8a81257afaaae0fb7a4160.tar.gz prosody-76bf6d511f851c7cde8a81257afaaae0fb7a4160.zip |
Merge 0.12->trunk
-rw-r--r-- | spec/json/pass4.json | 8 | ||||
-rw-r--r-- | util/json.lua | 19 |
2 files changed, 22 insertions, 5 deletions
diff --git a/spec/json/pass4.json b/spec/json/pass4.json new file mode 100644 index 00000000..595026ad --- /dev/null +++ b/spec/json/pass4.json @@ -0,0 +1,8 @@ +{ + "one": [ + + ], + "two": [], + "three": [ ], + "four": [ ] +} diff --git a/util/json.lua b/util/json.lua index a750da2e..e6704b7e 100644 --- a/util/json.lua +++ b/util/json.lua @@ -217,12 +217,19 @@ local function _readobject(json, index) end local function _readarray(json, index) local a = {}; - local oindex = index; while true do - local val; - val, index = _readvalue(json, index + 1); + local val, terminated; + val, index, terminated = _readvalue(json, index + 1, 0x5d); if val == nil then - if json:byte(oindex + 1) == 0x5d then return setmetatable(a, array_mt), oindex + 2; end -- "]" + if terminated then -- "]" found instead of value + if #a ~= 0 then + -- A non-empty array here means we processed a comma, + -- but it wasn't followed by a value. JSON doesn't allow + -- trailing commas. + return nil, "value expected"; + end + val, index = setmetatable(a, array_mt), index+1; + end return val, index; end t_insert(a, val); @@ -294,7 +301,7 @@ local function _readfalse(json, index) end return nil, "false parse failed"; end -function _readvalue(json, index) +function _readvalue(json, index, terminator) index = _skip_whitespace(json, index); local b = json:byte(index); -- TODO try table lookup instead of if-else? @@ -312,6 +319,8 @@ function _readvalue(json, index) return _readtrue(json, index); elseif b == 0x66 then -- "f" return _readfalse(json, index); + elseif b == terminator then + return nil, index, true; else return nil, "value expected"; end |