-
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
json start/end position implementation (#4517)
* Add implementation to retrieve start and end positions of json during parse * Add more unit tests and add start/stop parsing for arrays * Add raw value for all types * Add more tests and fix compiler warning * Amalgamate * Fix CLang GCC warnings * Fix error in build * Style using astyle 3.1 * Fix whitespace changes * revert * more whitespace reverts * Address PR comments * Fix failing issues * More whitespace reverts * Address remaining PR comments * Address comments * Switch to using custom base class instead of default basic_json * Adding a basic using for a json using the new base class. Also address PR comments and fix CI failures * Address decltype comments * Diagnostic positions macro (#4) Co-authored-by: Sush Shringarputale <sushring@linux.microsoft.com> * Fix missed include deletion * Add docs and address other PR comments (#5) * Add docs and address other PR comments --------- Co-authored-by: Sush Shringarputale <sushring@linux.microsoft.com> * Address new PR comments and fix CI tests for documentation * Update documentation based on feedback (#6) --------- Co-authored-by: Sush Shringarputale <sushring@linux.microsoft.com> * Address std::size_t and other comments * Fix new CI issues * Fix lcov * Improve lcov case with update to handle_diagnostic_positions call for discarded values * Fix indentation of LCOV_EXCL_STOP comments * fix amalgamation astyle issue --------- Co-authored-by: Sush Shringarputale <sushring@linux.microsoft.com>
- Loading branch information
1 parent
733c595
commit 58f5f25
Showing
20 changed files
with
4,784 additions
and
2,026 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
#include <iostream> | ||
|
||
#define JSON_DIAGNOSTIC_POSITIONS 1 | ||
#include <nlohmann/json.hpp> | ||
|
||
using json = nlohmann::json; | ||
|
||
int main() | ||
{ | ||
std::string json_string = R"( | ||
{ | ||
"address": { | ||
"street": "Fake Street", | ||
"housenumber": 1 | ||
} | ||
} | ||
)"; | ||
json j = json::parse(json_string); | ||
|
||
std::cout << "Root diagnostic positions: \n"; | ||
std::cout << "\tstart_pos: " << j.start_pos() << '\n'; | ||
std::cout << "\tend_pos:" << j.end_pos() << "\n"; | ||
std::cout << "Original string: \n"; | ||
std::cout << "{\n \"address\": {\n \"street\": \"Fake Street\",\n \"housenumber\": 1\n }\n }" << "\n"; | ||
std::cout << "Parsed string: \n"; | ||
std::cout << json_string.substr(j.start_pos(), j.end_pos() - j.start_pos()) << "\n\n"; | ||
|
||
std::cout << "address diagnostic positions: \n"; | ||
std::cout << "\tstart_pos:" << j["address"].start_pos() << '\n'; | ||
std::cout << "\tend_pos:" << j["address"].end_pos() << "\n\n"; | ||
std::cout << "Original string: \n"; | ||
std::cout << "{ \"street\": \"Fake Street\",\n \"housenumber\": 1\n }" << "\n"; | ||
std::cout << "Parsed string: \n"; | ||
std::cout << json_string.substr(j["address"].start_pos(), j["address"].end_pos() - j["address"].start_pos()) << "\n\n"; | ||
|
||
std::cout << "street diagnostic positions: \n"; | ||
std::cout << "\tstart_pos:" << j["address"]["street"].start_pos() << '\n'; | ||
std::cout << "\tend_pos:" << j["address"]["street"].end_pos() << "\n\n"; | ||
std::cout << "Original string: \n"; | ||
std::cout << "\"Fake Street\"" << "\n"; | ||
std::cout << "Parsed string: \n"; | ||
std::cout << json_string.substr(j["address"]["street"].start_pos(), j["address"]["street"].end_pos() - j["address"]["street"].start_pos()) << "\n\n"; | ||
|
||
std::cout << "housenumber diagnostic positions: \n"; | ||
std::cout << "\tstart_pos:" << j["address"]["housenumber"].start_pos() << '\n'; | ||
std::cout << "\tend_pos:" << j["address"]["housenumber"].end_pos() << "\n\n"; | ||
std::cout << "Original string: \n"; | ||
std::cout << "1" << "\n"; | ||
std::cout << "Parsed string: \n"; | ||
std::cout << json_string.substr(j["address"]["housenumber"].start_pos(), j["address"]["housenumber"].end_pos() - j["address"]["housenumber"].start_pos()) << "\n\n"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
Root diagnostic positions: | ||
start_pos: 5 | ||
end_pos:109 | ||
Original string: | ||
{ | ||
"address": { | ||
"street": "Fake Street", | ||
"housenumber": 1 | ||
} | ||
} | ||
Parsed string: | ||
{ | ||
"address": { | ||
"street": "Fake Street", | ||
"housenumber": 1 | ||
} | ||
} | ||
|
||
address diagnostic positions: | ||
start_pos:26 | ||
end_pos:103 | ||
|
||
Original string: | ||
{ "street": "Fake Street", | ||
"housenumber": 1 | ||
} | ||
Parsed string: | ||
{ | ||
"street": "Fake Street", | ||
"housenumber": 1 | ||
} | ||
|
||
street diagnostic positions: | ||
start_pos:50 | ||
end_pos:63 | ||
|
||
Original string: | ||
"Fake Street" | ||
Parsed string: | ||
"Fake Street" | ||
|
||
housenumber diagnostic positions: | ||
start_pos:92 | ||
end_pos:93 | ||
|
||
Original string: | ||
1 | ||
Parsed string: | ||
1 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
# JSON_DIAGNOSTIC_POSITIONS | ||
|
||
```cpp | ||
#define JSON_DIAGNOSTIC_POSITIONS /* value */ | ||
``` | ||
This macro enables position diagnostics for generated JSON objects. | ||
When enabled, two new properties: `start_pos()` and `end_pos()` are added to `nlohmann::basic_json` objects and fields. `start_pos()` returns the start | ||
position of that JSON object/field in the original string the object was parsed from. Likewise, `end_pos()` returns the end position of that JSON | ||
object/field in the original string the object was parsed from. | ||
`start_pos()` returns the first character of a given element in the original JSON string, while `end_pos()` returns the character following the last | ||
character. For objects and arrays, the first and last characters correspond to the opening or closing braces/brackets, respectively. For fields, the first | ||
and last character represent the opening and closing quotes or the first and last character of the field's numerical or predefined value | ||
(true/false/null), respectively. | ||
Given the above, `end_pos() - start_pos()` for an object or field provides the length of the string representation for that object or field, including the | ||
opening or closing braces, brackets, or quotes. | ||
`start_pos()` and `end_pos()` are only set if the JSON object was parsed using `parse()`. For all other cases, `std::string::npos` will be returned. | ||
Note that enabling this macro increases the size of every JSON value by two `std::size_t` fields and adds | ||
slight runtime overhead. | ||
## Default definition | ||
The default value is `0` (position diagnostics are switched off). | ||
```cpp | ||
#define JSON_DIAGNOSTIC_POSITIONS 0 | ||
``` | ||
|
||
When the macro is not defined, the library will define it to its default value. | ||
|
||
## Notes | ||
|
||
!!! hint "CMake option" | ||
|
||
Diagnostic messages can also be controlled with the CMake option | ||
[`JSON_Diagnostic_Positions`](../../integration/cmake.md#json_diagnostic_positions) (`OFF` by default) | ||
which defines `JSON_DIAGNOSTIC_POSITIONS` accordingly. | ||
|
||
## Examples | ||
|
||
??? example "Example 1: retrieving positions" | ||
|
||
```cpp | ||
--8<-- "examples/diagnostic_positions.cpp" | ||
``` | ||
|
||
Output: | ||
|
||
``` | ||
--8<-- "examples/diagnostic_positions.output" | ||
``` | ||
|
||
The output shows the start/end positions of all the objects and fields in the JSON string. | ||
|
||
## Version history | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.