mirror of
https://github.com/nlohmann/json.git
synced 2026-10-27 16:28:57 +00:00
* Docs: fill documentation gaps found in user questions Add pages on class-hierarchy/smart-pointer/variant/chrono recipes, working without exceptions, and large, streamed and partial input. Extend the FAQ (23 entries, Known bugs first), parse error documentation (empty-input checklist, line/column, diagnostic positions), element access, conversions, creating values, ADL troubleshooting, memory, and build/distribution notes. Add 14 examples with generated output. Correct the statement that parse errors cannot be recovered from with -fno-exceptions. The topics come from recurring questions on Stack Overflow, Reddit, Hacker News, YouTube, and the project's GitHub discussions and issues. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: declare range-for lists in variables to keep astyle quiet astyle reformats a braced init list placed directly in a range-for header; declare the list first so check_amalgamation passes. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
48 lines
1.1 KiB
C++
48 lines
1.1 KiB
C++
#include <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
|
|
std::string buffer;
|
|
|
|
// call for every chunk; returns true and sets `value` once the buffer holds one complete JSON value
|
|
bool push(const std::string& chunk, json& value)
|
|
{
|
|
buffer += chunk;
|
|
try
|
|
{
|
|
value = json::parse(buffer);
|
|
buffer.clear();
|
|
return true;
|
|
}
|
|
catch (const json::parse_error& e)
|
|
{
|
|
if (e.byte == buffer.size() + 1)
|
|
{
|
|
return false; // the input ends prematurely: wait for more data
|
|
}
|
|
throw; // a real syntax error
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
json value;
|
|
const auto chunks = {"{\"na", "me\": \"Ma", "ry\", \"l", "ist\": [1, 2", ", 3]}"};
|
|
for (const std::string chunk : chunks)
|
|
{
|
|
std::cout << "chunk " << chunk << " -> " << (push(chunk, value) ? "complete" : "incomplete") << '\n';
|
|
}
|
|
std::cout << value << '\n';
|
|
|
|
// a syntax error in the middle is not mistaken for missing data
|
|
try
|
|
{
|
|
push("[1, ]", value);
|
|
}
|
|
catch (const json::parse_error& e)
|
|
{
|
|
std::cout << e.what() << '\n';
|
|
}
|
|
}
|