mirror of
https://github.com/nlohmann/json.git
synced 2026-10-11 08:57:15 +00:00
Add json_document and json_view, a read-only, zero-copy index of a JSON text, as the first public slice of the zero-copy view (#5295). A parse produces a flat array of 16-byte nodes in document order, one per value and one per object key. Strings stay in the source text; escaped strings are decoded into an arena. Integers are converted while their digits are in the cache; floats keep only their digit layout and are converted on read. Containers store the size of their subtree, so a reader can step over one in constant time. A document makes a handful of allocations, however many values it has. The parser accepts exactly what json::parse accepts, with every combination of ignore_comments and ignore_trailing_commas, with and without a trailing NUL, and under JSON_STRICT_NUL_HANDLING. It is portable C++11 and does not depend on byte order. basic_json_document adds parse, parse_copy, accept, read (reuses a document's memory), root, is_discarded, source, owns_source, node_count, memory_usage, and shrink_to_fit. basic_json_view adds type, the is_* queries, operator bool, size, empty, materialize, and source_offset. A parse error throws the same exception basic_json::parse would throw for the same input, message and position included. detail::abi_config keeps JSON_STRICT_NUL_HANDLING and JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON readable after json.hpp undefines them, in the ABI namespace so they always match the basic_json in use. A NUL byte that ends a // comment is the end of the input, as in parse() since #5696. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
48 lines
2.0 KiB
C++
48 lines
2.0 KiB
C++
// __ _____ _____ _____
|
|
// __| | __| | | | JSON for Modern C++ (supporting code)
|
|
// | | |__ | | | | | | version 3.12.0
|
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
//
|
|
// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#include "doctest_compatibility.h"
|
|
|
|
// All other tests keep the library's macros (JSON_TEST_KEEP_MACROS). This one
|
|
// includes json_view.hpp as users do, so that json.hpp undefines its macros
|
|
// (JSON_HAS_CPP_17, JSON_STRICT_NUL_HANDLING, ...) before the view is compiled.
|
|
#undef JSON_TEST_KEEP_MACROS
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
#include <string>
|
|
#include <type_traits>
|
|
|
|
#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
|
#include <string_view>
|
|
#define JSON_VIEW_TEST_HAS_STRING_VIEW 1
|
|
#else
|
|
#define JSON_VIEW_TEST_HAS_STRING_VIEW 0
|
|
#endif
|
|
|
|
// the view's own macros do not leak
|
|
#if defined(NLOHMANN_VIEW_LIKELY) || defined(NLOHMANN_VIEW_UNLIKELY) || defined(NLOHMANN_VIEW_ALWAYS_INLINE) || defined(NLOHMANN_VIEW_NOINLINE) \
|
|
|| defined(NLOHMANN_VIEW_NODISCARD) || defined(NLOHMANN_VIEW_THROW) || defined(NLOHMANN_VIEW_HAS_CPP_17) || defined(NLOHMANN_VIEW_LITTLE_ENDIAN) \
|
|
|| defined(NLOHMANN_VIEW_REPEAT16)
|
|
#error "json_view.hpp leaks a macro"
|
|
#endif
|
|
|
|
TEST_CASE("json_view without the library's macros")
|
|
{
|
|
// (this file also gets C++17 builds: it mentions JSON_HAS_CPP_17)
|
|
#if JSON_VIEW_TEST_HAS_STRING_VIEW
|
|
CHECK(std::is_same<nlohmann::json_view::string_view_t, std::string_view>::value);
|
|
#endif
|
|
const std::string text = "[1, 2.5, \"x\"]";
|
|
const nlohmann::json_document d = nlohmann::json_document::parse(text);
|
|
CHECK(d.root().size() == 3);
|
|
CHECK(d.root().materialize() == nlohmann::json::parse(text));
|
|
// the NUL handling of the library's configuration
|
|
const std::string with_nul("[1]\0x", 5);
|
|
CHECK(nlohmann::json_document::accept(with_nul) == nlohmann::json::accept(with_nul));
|
|
}
|