From 65e8ee985ae31e73223e6f722c26d6a1fb0563c8 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 22 Jun 2020 08:59:03 +0200 Subject: [PATCH] :hammer: clean up --- README.md | 8 ++--- include/nlohmann/detail/input/lexer.hpp | 21 +++++++------ include/nlohmann/json.hpp | 21 +++++++------ single_include/nlohmann/json.hpp | 42 ++++++++++++++----------- 4 files changed, 48 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 42d057a35..0699bdc30 100644 --- a/README.md +++ b/README.md @@ -1508,7 +1508,7 @@ The library supports **Unicode input** as follows: ### Comments in JSON -This library does not support comments. It does so for three reasons: +This library does not support comments by default. It does so for three reasons: 1. Comments are not part of the [JSON specification](https://tools.ietf.org/html/rfc8259). You may argue that `//` or `/* */` are allowed in JavaScript, but JSON is not JavaScript. 2. This was not an oversight: Douglas Crockford [wrote on this](https://plus.google.com/118095276221607585885/posts/RK8qyGVaGSr) in May 2012: @@ -1519,11 +1519,7 @@ This library does not support comments. It does so for three reasons: 3. It is dangerous for interoperability if some libraries would add comment support while others don't. Please check [The Harmful Consequences of the Robustness Principle](https://tools.ietf.org/html/draft-iab-protocol-maintenance-01) on this. -This library will not support comments in the future. If you wish to use comments, I see three options: - -1. Strip comments before using this library. -2. Use a different JSON library with comment support. -3. Use a format that natively supports comments (e.g., YAML or JSON5). +However, you can pass set parameter `ignore_comments` to true in the `parse` function to ignore `//` or `/* */` comments. Comments will then be treated as whitespace. ### Order of object keys diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 580b1c225..8042f3c4e 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1489,6 +1489,15 @@ scan_number_done: return true; } + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' or current == '\t' or current == '\n' or current == '\r'); + } + token_type scan() { // initially, skip the BOM @@ -1499,11 +1508,7 @@ scan_number_done: } // read next character and ignore whitespace - do - { - get(); - } - while (current == ' ' or current == '\t' or current == '\n' or current == '\r'); + skip_whitespace(); // ignore comments if (ignore_comments and current == '/') @@ -1514,11 +1519,7 @@ scan_number_done: } // skip following whitespace - do - { - get(); - } - while (current == ' ' or current == '\t' or current == '\n' or current == '\r'); + skip_whitespace(); } switch (current) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index f4fa590ca..cc7e3fbc2 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -6565,8 +6565,9 @@ class basic_json (optional) @param[in] allow_exceptions whether to throw exceptions in case of a parse error (optional, true by default) - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default) + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default) @return deserialized JSON value; in case of a parse error and @a allow_exceptions set to `false`, the return value will be @@ -6623,8 +6624,9 @@ class basic_json (optional) @param[in] allow_exceptions whether to throw exceptions in case of a parse error (optional, true by default) - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default) + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default) @return deserialized JSON value; in case of a parse error and @a allow_exceptions set to `false`, the return value will be @@ -6676,8 +6678,9 @@ class basic_json iterators. @param[in] i input to read from - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default) + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default) @return Whether the input read from @a i is valid JSON. @@ -6728,9 +6731,9 @@ class basic_json @param[in,out] sax SAX event listener @param[in] format the format to parse (JSON, CBOR, MessagePack, or UBJSON) @param[in] strict whether the input has to be consumed completely - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default); only applieds to - the JSON file format. + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default); only applies to the JSON file format. @return return value of the last processed SAX event diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index cdc3de095..683e2d560 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -9556,6 +9556,15 @@ scan_number_done: return true; } + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' or current == '\t' or current == '\n' or current == '\r'); + } + token_type scan() { // initially, skip the BOM @@ -9566,11 +9575,7 @@ scan_number_done: } // read next character and ignore whitespace - do - { - get(); - } - while (current == ' ' or current == '\t' or current == '\n' or current == '\r'); + skip_whitespace(); // ignore comments if (ignore_comments and current == '/') @@ -9581,11 +9586,7 @@ scan_number_done: } // skip following whitespace - do - { - get(); - } - while (current == ' ' or current == '\t' or current == '\n' or current == '\r'); + skip_whitespace(); } switch (current) @@ -22451,8 +22452,9 @@ class basic_json (optional) @param[in] allow_exceptions whether to throw exceptions in case of a parse error (optional, true by default) - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default) + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default) @return deserialized JSON value; in case of a parse error and @a allow_exceptions set to `false`, the return value will be @@ -22509,8 +22511,9 @@ class basic_json (optional) @param[in] allow_exceptions whether to throw exceptions in case of a parse error (optional, true by default) - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default) + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default) @return deserialized JSON value; in case of a parse error and @a allow_exceptions set to `false`, the return value will be @@ -22562,8 +22565,9 @@ class basic_json iterators. @param[in] i input to read from - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default) + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default) @return Whether the input read from @a i is valid JSON. @@ -22614,9 +22618,9 @@ class basic_json @param[in,out] sax SAX event listener @param[in] format the format to parse (JSON, CBOR, MessagePack, or UBJSON) @param[in] strict whether the input has to be consumed completely - @param[in] ignore_comments whether comments should be ignored (true) or - yield a parse error (true); (optional, false by default); only applieds to - the JSON file format. + @param[in] ignore_comments whether comments should be ignored and treated + like whitespace (true) or yield a parse error (true); (optional, false by + default); only applies to the JSON file format. @return return value of the last processed SAX event