From 554d961625e6857a55d99d29d7136e39b6f5302a Mon Sep 17 00:00:00 2001 From: Jacob Bundgaard Date: Thu, 17 Oct 2019 16:03:31 +0200 Subject: [PATCH] Allow trailing comma in arrays if dropped null placeholders are not allowed --- src/lib_json/json_reader.cpp | 29 +++++++++++++++-------------- test/data/fail_test_array_02.json | 1 + test/data/test_array_08.expected | 2 ++ test/data/test_array_08.json | 1 + 4 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 test/data/fail_test_array_02.json create mode 100644 test/data/test_array_08.expected create mode 100644 test/data/test_array_08.json diff --git a/src/lib_json/json_reader.cpp b/src/lib_json/json_reader.cpp index e539793..aa788cd 100644 --- a/src/lib_json/json_reader.cpp +++ b/src/lib_json/json_reader.cpp @@ -503,15 +503,16 @@ bool Reader::readArray(Token& token) { Value init(arrayValue); currentValue().swapPayload(init); currentValue().setOffsetStart(token.start_ - begin_); - skipSpaces(); - if (current_ != end_ && *current_ == ']') // empty array - { - Token endArray; - readToken(endArray); - return true; - } int index = 0; for (;;) { + skipSpaces(); + if (current_ != end_ && *current_ == ']' && (index == 0 || (features_.allowTrailingCommas_ && !features_.allowDroppedNullPlaceholders_))) // empty array or trailing comma + { + Token endArray; + readToken(endArray); + return true; + } + Value& value = currentValue()[index++]; nodes_.push(&value); bool ok = readValue(); @@ -1493,15 +1494,15 @@ bool OurReader::readArray(Token& token) { Value init(arrayValue); currentValue().swapPayload(init); currentValue().setOffsetStart(token.start_ - begin_); - skipSpaces(); - if (current_ != end_ && *current_ == ']') // empty array - { - Token endArray; - readToken(endArray); - return true; - } int index = 0; for (;;) { + skipSpaces(); + if (current_ != end_ && *current_ == ']' && (index == 0 || (features_.allowTrailingCommas_ && !features_.allowDroppedNullPlaceholders_))) // empty array or trailing comma + { + Token endArray; + readToken(endArray); + return true; + } Value& value = currentValue()[index++]; nodes_.push(&value); bool ok = readValue(); diff --git a/test/data/fail_test_array_02.json b/test/data/fail_test_array_02.json new file mode 100644 index 0000000..222a1b4 --- /dev/null +++ b/test/data/fail_test_array_02.json @@ -0,0 +1 @@ +[1,,] diff --git a/test/data/test_array_08.expected b/test/data/test_array_08.expected new file mode 100644 index 0000000..ef1f262 --- /dev/null +++ b/test/data/test_array_08.expected @@ -0,0 +1,2 @@ +.=[] +.[0]=1 diff --git a/test/data/test_array_08.json b/test/data/test_array_08.json new file mode 100644 index 0000000..e8b1a17 --- /dev/null +++ b/test/data/test_array_08.json @@ -0,0 +1 @@ +[1,]