-
-
Notifications
You must be signed in to change notification settings - Fork 7.1k
json start/end position implementation #4517
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
35 commits
Select commit
Hold shift + click to select a range
02f5bca
Add implementation to retrieve start and end positions of json during…
sushshring 311861f
Add more unit tests and add start/stop parsing for arrays
sushshring 226d79b
Merge branch 'nlohmann:develop' into develop
sushshring b3f6499
Add raw value for all types
sushshring ab744aa
Merge branch 'develop' of https://github.com/sushshring/json into dev…
sushshring d321cdb
Add more tests and fix compiler warning
sushshring 64ad6ce
Amalgamate
e820747
Fix CLang GCC warnings
3629ceb
Fix error in build
b42036b
Style using astyle 3.1
2575678
Fix whitespace changes
9de6ed1
revert
3bbca5e
more whitespace reverts
fa32e81
Address PR comments
b806d44
Fix failing issues
7d662ec
More whitespace reverts
3625875
Address remaining PR comments
9359441
Address comments
79e6513
Merge remote-tracking branch 'nlohmann/develop' into develop
a31d8b8
Switch to using custom base class instead of default basic_json
1d70d2b
Adding a basic using for a json using the new base class. Also addres…
814f367
Address decltype comments
4986e99
Diagnostic positions macro (#4)
sushshring b96a5d1
Fix missed include deletion
4406594
Add docs and address other PR comments (#5)
sushshring 8c67186
Address new PR comments and fix CI tests for documentation
6c04575
Update documentation based on feedback (#6)
sushshring 3d425d6
Merge branch 'develop' into develop
sushshring 94505ba
Address std::size_t and other comments
556ab6b
Fix new CI issues
7f599cf
Fix lcov
5592cb3
Improve lcov case with update to handle_diagnostic_positions call for…
920e9a7
Fix indentation of LCOV_EXCL_STOP comments
sushshring aa14b15
fix amalgamation astyle issue
c4d1091
Merge remote-tracking branch 'nlohmann/develop' into develop
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.