|
@@ -1,9 +1,9 @@
|
|
|
// __ _____ _____ _____
|
|
|
// __| | __| | | | JSON for Modern C++
|
|
|
-// | | |__ | | | | | | version 3.11.3
|
|
|
+// | | |__ | | | | | | version 3.12.0
|
|
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
|
//
|
|
|
-// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
|
|
+// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
/****************************************************************************\
|
|
@@ -52,6 +52,7 @@
|
|
|
#include <nlohmann/detail/macro_scope.hpp>
|
|
|
#include <nlohmann/detail/string_concat.hpp>
|
|
|
#include <nlohmann/detail/string_escape.hpp>
|
|
|
+#include <nlohmann/detail/string_utils.hpp>
|
|
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
|
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
|
|
#include <nlohmann/detail/output/binary_writer.hpp>
|
|
@@ -114,9 +115,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
friend class ::nlohmann::detail::binary_writer;
|
|
|
template<typename BasicJsonType, typename InputType, typename SAX>
|
|
|
friend class ::nlohmann::detail::binary_reader;
|
|
|
- template<typename BasicJsonType>
|
|
|
+ template<typename BasicJsonType, typename InputAdapterType>
|
|
|
friend class ::nlohmann::detail::json_sax_dom_parser;
|
|
|
- template<typename BasicJsonType>
|
|
|
+ template<typename BasicJsonType, typename InputAdapterType>
|
|
|
friend class ::nlohmann::detail::json_sax_dom_callback_parser;
|
|
|
friend class ::nlohmann::detail::exception;
|
|
|
|
|
@@ -137,7 +138,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
)
|
|
|
{
|
|
|
return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),
|
|
|
- std::move(cb), allow_exceptions, ignore_comments);
|
|
|
+ std::move(cb), allow_exceptions, ignore_comments);
|
|
|
}
|
|
|
|
|
|
private:
|
|
@@ -170,6 +171,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
using error_handler_t = detail::error_handler_t;
|
|
|
/// how to treat CBOR tags
|
|
|
using cbor_tag_handler_t = detail::cbor_tag_handler_t;
|
|
|
+ /// how to encode BJData
|
|
|
+ using bjdata_version_t = detail::bjdata_version_t;
|
|
|
/// helper type for initializer lists of basic_json values
|
|
|
using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>;
|
|
|
|
|
@@ -249,7 +252,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
{
|
|
|
basic_json result;
|
|
|
|
|
|
- result["copyright"] = "(C) 2013-2023 Niels Lohmann";
|
|
|
+ result["copyright"] = "(C) 2013-2025 Niels Lohmann";
|
|
|
result["name"] = "JSON for Modern C++";
|
|
|
result["url"] = "https://github.com/nlohmann/json";
|
|
|
result["version"]["string"] =
|
|
@@ -514,7 +517,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
object = nullptr; // silence warning, see #821
|
|
|
if (JSON_HEDLEY_UNLIKELY(t == value_t::null))
|
|
|
{
|
|
|
- JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.11.3", nullptr)); // LCOV_EXCL_LINE
|
|
|
+ JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.12.0", nullptr)); // LCOV_EXCL_LINE
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -750,10 +753,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
return it;
|
|
|
}
|
|
|
|
|
|
- reference set_parent(reference j, std::size_t old_capacity = static_cast<std::size_t>(-1))
|
|
|
+ reference set_parent(reference j, std::size_t old_capacity = detail::unknown_size())
|
|
|
{
|
|
|
#if JSON_DIAGNOSTICS
|
|
|
- if (old_capacity != static_cast<std::size_t>(-1))
|
|
|
+ if (old_capacity != detail::unknown_size())
|
|
|
{
|
|
|
// see https://github.com/nlohmann/json/issues/2838
|
|
|
JSON_ASSERT(type() == value_t::array);
|
|
@@ -847,6 +850,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
detail::enable_if_t <
|
|
|
detail::is_basic_json<BasicJsonType>::value&& !std::is_same<basic_json, BasicJsonType>::value, int > = 0 >
|
|
|
basic_json(const BasicJsonType& val)
|
|
|
+#if JSON_DIAGNOSTIC_POSITIONS
|
|
|
+ : start_position(val.start_pos()),
|
|
|
+ end_position(val.end_pos())
|
|
|
+#endif
|
|
|
{
|
|
|
using other_boolean_t = typename BasicJsonType::boolean_t;
|
|
|
using other_number_float_t = typename BasicJsonType::number_float_t;
|
|
@@ -893,6 +900,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
|
|
|
}
|
|
|
JSON_ASSERT(m_data.m_type == val.type());
|
|
|
+
|
|
|
set_parents();
|
|
|
assert_invariant();
|
|
|
}
|
|
@@ -1029,7 +1037,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
template < class InputIT, typename std::enable_if <
|
|
|
std::is_same<InputIT, typename basic_json_t::iterator>::value ||
|
|
|
std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int >::type = 0 >
|
|
|
- basic_json(InputIT first, InputIT last)
|
|
|
+ basic_json(InputIT first, InputIT last) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
JSON_ASSERT(first.m_object != nullptr);
|
|
|
JSON_ASSERT(last.m_object != nullptr);
|
|
@@ -1144,6 +1152,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/basic_json/
|
|
|
basic_json(const basic_json& other)
|
|
|
: json_base_class_t(other)
|
|
|
+#if JSON_DIAGNOSTIC_POSITIONS
|
|
|
+ , start_position(other.start_position)
|
|
|
+ , end_position(other.end_position)
|
|
|
+#endif
|
|
|
{
|
|
|
m_data.m_type = other.m_data.m_type;
|
|
|
// check of passed value is valid
|
|
@@ -1213,15 +1225,24 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/basic_json/
|
|
|
basic_json(basic_json&& other) noexcept
|
|
|
: json_base_class_t(std::forward<json_base_class_t>(other)),
|
|
|
- m_data(std::move(other.m_data))
|
|
|
+ m_data(std::move(other.m_data)) // cppcheck-suppress[accessForwarded] TODO check
|
|
|
+#if JSON_DIAGNOSTIC_POSITIONS
|
|
|
+ , start_position(other.start_position) // cppcheck-suppress[accessForwarded] TODO check
|
|
|
+ , end_position(other.end_position) // cppcheck-suppress[accessForwarded] TODO check
|
|
|
+#endif
|
|
|
{
|
|
|
// check that passed value is valid
|
|
|
- other.assert_invariant(false);
|
|
|
+ other.assert_invariant(false); // cppcheck-suppress[accessForwarded]
|
|
|
|
|
|
// invalidate payload
|
|
|
other.m_data.m_type = value_t::null;
|
|
|
other.m_data.m_value = {};
|
|
|
|
|
|
+#if JSON_DIAGNOSTIC_POSITIONS
|
|
|
+ other.start_position = std::string::npos;
|
|
|
+ other.end_position = std::string::npos;
|
|
|
+#endif
|
|
|
+
|
|
|
set_parents();
|
|
|
assert_invariant();
|
|
|
}
|
|
@@ -1242,6 +1263,12 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
using std::swap;
|
|
|
swap(m_data.m_type, other.m_data.m_type);
|
|
|
swap(m_data.m_value, other.m_data.m_value);
|
|
|
+
|
|
|
+#if JSON_DIAGNOSTIC_POSITIONS
|
|
|
+ swap(start_position, other.start_position);
|
|
|
+ swap(end_position, other.end_position);
|
|
|
+#endif
|
|
|
+
|
|
|
json_base_class_t::operator=(std::move(other));
|
|
|
|
|
|
set_parents();
|
|
@@ -1463,13 +1490,13 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
/// get a pointer to the value (integer number)
|
|
|
number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept
|
|
|
{
|
|
|
- return is_number_integer() ? &m_data.m_value.number_integer : nullptr;
|
|
|
+ return m_data.m_type == value_t::number_integer ? &m_data.m_value.number_integer : nullptr;
|
|
|
}
|
|
|
|
|
|
/// get a pointer to the value (integer number)
|
|
|
constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept
|
|
|
{
|
|
|
- return is_number_integer() ? &m_data.m_value.number_integer : nullptr;
|
|
|
+ return m_data.m_type == value_t::number_integer ? &m_data.m_value.number_integer : nullptr;
|
|
|
}
|
|
|
|
|
|
/// get a pointer to the value (unsigned number)
|
|
@@ -1948,7 +1975,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
{
|
|
|
// create better exception explanation
|
|
|
JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this));
|
|
|
- }
|
|
|
+ } // cppcheck-suppress[missingReturn]
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -1971,7 +1998,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
{
|
|
|
// create better exception explanation
|
|
|
JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this));
|
|
|
- }
|
|
|
+ } // cppcheck-suppress[missingReturn]
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -2116,7 +2143,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
/// @brief access specified object element
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/
|
|
|
- reference operator[](typename object_t::key_type key)
|
|
|
+ reference operator[](typename object_t::key_type key) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// implicitly convert null value to an empty object
|
|
|
if (is_null())
|
|
@@ -2426,7 +2453,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
template < class IteratorType, detail::enable_if_t <
|
|
|
std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
|
|
|
std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 >
|
|
|
- IteratorType erase(IteratorType pos)
|
|
|
+ IteratorType erase(IteratorType pos) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// make sure iterator fits the current value
|
|
|
if (JSON_HEDLEY_UNLIKELY(this != pos.m_object))
|
|
@@ -2496,7 +2523,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
template < class IteratorType, detail::enable_if_t <
|
|
|
std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
|
|
|
std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 >
|
|
|
- IteratorType erase(IteratorType first, IteratorType last)
|
|
|
+ IteratorType erase(IteratorType first, IteratorType last) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// make sure iterator fits the current value
|
|
|
if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object))
|
|
@@ -3263,7 +3290,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
/// @note: This uses std::distance to support GCC 4.8,
|
|
|
/// see https://github.com/nlohmann/json/pull/1257
|
|
|
template<typename... Args>
|
|
|
- iterator insert_iterator(const_iterator pos, Args&& ... args)
|
|
|
+ iterator insert_iterator(const_iterator pos, Args&& ... args) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
iterator result(this);
|
|
|
JSON_ASSERT(m_data.m_value.array != nullptr);
|
|
@@ -3282,7 +3309,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
/// @brief inserts element into array
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/insert/
|
|
|
- iterator insert(const_iterator pos, const basic_json& val)
|
|
|
+ iterator insert(const_iterator pos, const basic_json& val) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// insert only works for arrays
|
|
|
if (JSON_HEDLEY_LIKELY(is_array()))
|
|
@@ -3302,14 +3329,14 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
/// @brief inserts element into array
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/insert/
|
|
|
- iterator insert(const_iterator pos, basic_json&& val)
|
|
|
+ iterator insert(const_iterator pos, basic_json&& val) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
return insert(pos, val);
|
|
|
}
|
|
|
|
|
|
/// @brief inserts copies of element into array
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/insert/
|
|
|
- iterator insert(const_iterator pos, size_type cnt, const basic_json& val)
|
|
|
+ iterator insert(const_iterator pos, size_type cnt, const basic_json& val) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// insert only works for arrays
|
|
|
if (JSON_HEDLEY_LIKELY(is_array()))
|
|
@@ -3329,7 +3356,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
/// @brief inserts range of elements into array
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/insert/
|
|
|
- iterator insert(const_iterator pos, const_iterator first, const_iterator last)
|
|
|
+ iterator insert(const_iterator pos, const_iterator first, const_iterator last) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// insert only works for arrays
|
|
|
if (JSON_HEDLEY_UNLIKELY(!is_array()))
|
|
@@ -3360,7 +3387,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
/// @brief inserts elements from initializer list into array
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/insert/
|
|
|
- iterator insert(const_iterator pos, initializer_list_t ilist)
|
|
|
+ iterator insert(const_iterator pos, initializer_list_t ilist) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// insert only works for arrays
|
|
|
if (JSON_HEDLEY_UNLIKELY(!is_array()))
|
|
@@ -3380,7 +3407,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
/// @brief inserts range of elements into object
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/insert/
|
|
|
- void insert(const_iterator first, const_iterator last)
|
|
|
+ void insert(const_iterator first, const_iterator last) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// insert only works for objects
|
|
|
if (JSON_HEDLEY_UNLIKELY(!is_object()))
|
|
@@ -3401,6 +3428,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
}
|
|
|
|
|
|
m_data.m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);
|
|
|
+ set_parents();
|
|
|
}
|
|
|
|
|
|
/// @brief updates a JSON object from another object, overwriting existing keys
|
|
@@ -3412,7 +3440,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
/// @brief updates a JSON object from another object, overwriting existing keys
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/update/
|
|
|
- void update(const_iterator first, const_iterator last, bool merge_objects = false)
|
|
|
+ void update(const_iterator first, const_iterator last, bool merge_objects = false) // NOLINT(performance-unnecessary-value-param)
|
|
|
{
|
|
|
// implicitly convert null value to an empty object
|
|
|
if (is_null())
|
|
@@ -4013,12 +4041,12 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
template<typename InputType>
|
|
|
JSON_HEDLEY_WARN_UNUSED_RESULT
|
|
|
static basic_json parse(InputType&& i,
|
|
|
- const parser_callback_t cb = nullptr,
|
|
|
+ parser_callback_t cb = nullptr,
|
|
|
const bool allow_exceptions = true,
|
|
|
const bool ignore_comments = false)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(true, result);
|
|
|
+ parser(detail::input_adapter(std::forward<InputType>(i)), std::move(cb), allow_exceptions, ignore_comments).parse(true, result); // cppcheck-suppress[accessMoved,accessForwarded]
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -4028,24 +4056,24 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
JSON_HEDLEY_WARN_UNUSED_RESULT
|
|
|
static basic_json parse(IteratorType first,
|
|
|
IteratorType last,
|
|
|
- const parser_callback_t cb = nullptr,
|
|
|
+ parser_callback_t cb = nullptr,
|
|
|
const bool allow_exceptions = true,
|
|
|
const bool ignore_comments = false)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result);
|
|
|
+ parser(detail::input_adapter(std::move(first), std::move(last)), std::move(cb), allow_exceptions, ignore_comments).parse(true, result); // cppcheck-suppress[accessMoved]
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
JSON_HEDLEY_WARN_UNUSED_RESULT
|
|
|
JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len))
|
|
|
static basic_json parse(detail::span_input_adapter&& i,
|
|
|
- const parser_callback_t cb = nullptr,
|
|
|
+ parser_callback_t cb = nullptr,
|
|
|
const bool allow_exceptions = true,
|
|
|
const bool ignore_comments = false)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result);
|
|
|
+ parser(i.get(), std::move(cb), allow_exceptions, ignore_comments).parse(true, result); // cppcheck-suppress[accessMoved]
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -4224,6 +4252,23 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
basic_json* m_parent = nullptr;
|
|
|
#endif
|
|
|
|
|
|
+#if JSON_DIAGNOSTIC_POSITIONS
|
|
|
+ /// the start position of the value
|
|
|
+ std::size_t start_position = std::string::npos;
|
|
|
+ /// the end position of the value
|
|
|
+ std::size_t end_position = std::string::npos;
|
|
|
+ public:
|
|
|
+ constexpr std::size_t start_pos() const noexcept
|
|
|
+ {
|
|
|
+ return start_position;
|
|
|
+ }
|
|
|
+
|
|
|
+ constexpr std::size_t end_pos() const noexcept
|
|
|
+ {
|
|
|
+ return end_position;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
//////////////////////////////////////////
|
|
|
// binary serialization/deserialization //
|
|
|
//////////////////////////////////////////
|
|
@@ -4309,27 +4354,30 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/
|
|
|
static std::vector<std::uint8_t> to_bjdata(const basic_json& j,
|
|
|
const bool use_size = false,
|
|
|
- const bool use_type = false)
|
|
|
+ const bool use_type = false,
|
|
|
+ const bjdata_version_t version = bjdata_version_t::draft2)
|
|
|
{
|
|
|
std::vector<std::uint8_t> result;
|
|
|
- to_bjdata(j, result, use_size, use_type);
|
|
|
+ to_bjdata(j, result, use_size, use_type, version);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
/// @brief create a BJData serialization of a given JSON value
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/
|
|
|
static void to_bjdata(const basic_json& j, detail::output_adapter<std::uint8_t> o,
|
|
|
- const bool use_size = false, const bool use_type = false)
|
|
|
+ const bool use_size = false, const bool use_type = false,
|
|
|
+ const bjdata_version_t version = bjdata_version_t::draft2)
|
|
|
{
|
|
|
- binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type, true, true);
|
|
|
+ binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type, true, true, version);
|
|
|
}
|
|
|
|
|
|
/// @brief create a BJData serialization of a given JSON value
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/
|
|
|
static void to_bjdata(const basic_json& j, detail::output_adapter<char> o,
|
|
|
- const bool use_size = false, const bool use_type = false)
|
|
|
+ const bool use_size = false, const bool use_type = false,
|
|
|
+ const bjdata_version_t version = bjdata_version_t::draft2)
|
|
|
{
|
|
|
- binary_writer<char>(o).write_ubjson(j, use_size, use_type, true, true);
|
|
|
+ binary_writer<char>(o).write_ubjson(j, use_size, use_type, true, true, version);
|
|
|
}
|
|
|
|
|
|
/// @brief create a BSON serialization of a given JSON value
|
|
@@ -4365,9 +4413,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::forward<InputType>(i));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4381,9 +4429,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::move(first), std::move(last));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4406,10 +4454,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = i.get();
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
// NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4422,9 +4470,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::forward<InputType>(i));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4437,9 +4485,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::move(first), std::move(last));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4460,10 +4508,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = i.get();
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
// NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4476,9 +4524,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::forward<InputType>(i));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4491,9 +4539,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::move(first), std::move(last));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4514,10 +4562,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = i.get();
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
// NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4530,9 +4578,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::forward<InputType>(i));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4545,9 +4593,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::move(first), std::move(last));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4560,9 +4608,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::forward<InputType>(i));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4575,9 +4623,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = detail::input_adapter(std::move(first), std::move(last));
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict);
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
|
|
@@ -4598,10 +4646,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
const bool allow_exceptions = true)
|
|
|
{
|
|
|
basic_json result;
|
|
|
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
|
|
|
auto ia = i.get();
|
|
|
+ detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
|
|
|
// NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
|
|
|
- const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict);
|
|
|
+ const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]
|
|
|
return res ? result : basic_json(value_t::discarded);
|
|
|
}
|
|
|
/// @}
|
|
@@ -4702,7 +4750,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
// the valid JSON Patch operations
|
|
|
enum class patch_operations {add, remove, replace, move, copy, test, invalid};
|
|
|
|
|
|
- const auto get_op = [](const std::string & op)
|
|
|
+ const auto get_op = [](const string_t& op)
|
|
|
{
|
|
|
if (op == "add")
|
|
|
{
|
|
@@ -4733,7 +4781,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
};
|
|
|
|
|
|
// wrapper for "add" operation; add value at ptr
|
|
|
- const auto operation_add = [&result](json_pointer & ptr, basic_json val)
|
|
|
+ const auto operation_add = [&result](json_pointer & ptr, const basic_json & val)
|
|
|
{
|
|
|
// adding to the root of the target document means replacing it
|
|
|
if (ptr.empty())
|
|
@@ -4839,15 +4887,15 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
for (const auto& val : json_patch)
|
|
|
{
|
|
|
// wrapper to get a value for an operation
|
|
|
- const auto get_value = [&val](const std::string & op,
|
|
|
- const std::string & member,
|
|
|
+ const auto get_value = [&val](const string_t& op,
|
|
|
+ const string_t& member,
|
|
|
bool string_type) -> basic_json &
|
|
|
{
|
|
|
// find value
|
|
|
auto it = val.m_data.m_value.object->find(member);
|
|
|
|
|
|
// context-sensitive error message
|
|
|
- const auto error_msg = (op == "op") ? "operation" : detail::concat("operation '", op, '\'');
|
|
|
+ const auto error_msg = (op == "op") ? "operation" : detail::concat("operation '", op, '\''); // NOLINT(bugprone-unused-local-non-trivial-variable)
|
|
|
|
|
|
// check if desired value is present
|
|
|
if (JSON_HEDLEY_UNLIKELY(it == val.m_data.m_value.object->end()))
|
|
@@ -4874,8 +4922,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
}
|
|
|
|
|
|
// collect mandatory members
|
|
|
- const auto op = get_value("op", "op", true).template get<std::string>();
|
|
|
- const auto path = get_value(op, "path", true).template get<std::string>();
|
|
|
+ const auto op = get_value("op", "op", true).template get<string_t>();
|
|
|
+ const auto path = get_value(op, "path", true).template get<string_t>();
|
|
|
json_pointer ptr(path);
|
|
|
|
|
|
switch (get_op(op))
|
|
@@ -4901,7 +4949,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
case patch_operations::move:
|
|
|
{
|
|
|
- const auto from_path = get_value("move", "from", true).template get<std::string>();
|
|
|
+ const auto from_path = get_value("move", "from", true).template get<string_t>();
|
|
|
json_pointer from_ptr(from_path);
|
|
|
|
|
|
// the "from" location must exist - use at()
|
|
@@ -4918,7 +4966,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
|
|
|
case patch_operations::copy:
|
|
|
{
|
|
|
- const auto from_path = get_value("copy", "from", true).template get<std::string>();
|
|
|
+ const auto from_path = get_value("copy", "from", true).template get<string_t>();
|
|
|
const json_pointer from_ptr(from_path);
|
|
|
|
|
|
// the "from" location must exist - use at()
|
|
@@ -4978,7 +5026,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
/// @sa https://json.nlohmann.me/api/basic_json/diff/
|
|
|
JSON_HEDLEY_WARN_UNUSED_RESULT
|
|
|
static basic_json diff(const basic_json& source, const basic_json& target,
|
|
|
- const std::string& path = "")
|
|
|
+ const string_t& path = "")
|
|
|
{
|
|
|
// the patch
|
|
|
basic_json result(value_t::array);
|
|
@@ -5008,7 +5056,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
while (i < source.size() && i < target.size())
|
|
|
{
|
|
|
// recursive call to compare array values at index i
|
|
|
- auto temp_diff = diff(source[i], target[i], detail::concat(path, '/', std::to_string(i)));
|
|
|
+ auto temp_diff = diff(source[i], target[i], detail::concat<string_t>(path, '/', detail::to_string<string_t>(i)));
|
|
|
result.insert(result.end(), temp_diff.begin(), temp_diff.end());
|
|
|
++i;
|
|
|
}
|
|
@@ -5025,7 +5073,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
result.insert(result.begin() + end_index, object(
|
|
|
{
|
|
|
{"op", "remove"},
|
|
|
- {"path", detail::concat(path, '/', std::to_string(i))}
|
|
|
+ {"path", detail::concat<string_t>(path, '/', detail::to_string<string_t>(i))}
|
|
|
}));
|
|
|
++i;
|
|
|
}
|
|
@@ -5036,7 +5084,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
result.push_back(
|
|
|
{
|
|
|
{"op", "add"},
|
|
|
- {"path", detail::concat(path, "/-")},
|
|
|
+ {"path", detail::concat<string_t>(path, "/-")},
|
|
|
{"value", target[i]}
|
|
|
});
|
|
|
++i;
|
|
@@ -5051,7 +5099,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
for (auto it = source.cbegin(); it != source.cend(); ++it)
|
|
|
{
|
|
|
// escape the key name to be used in a JSON patch
|
|
|
- const auto path_key = detail::concat(path, '/', detail::escape(it.key()));
|
|
|
+ const auto path_key = detail::concat<string_t>(path, '/', detail::escape(it.key()));
|
|
|
|
|
|
if (target.find(it.key()) != target.end())
|
|
|
{
|
|
@@ -5075,7 +5123,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|
|
if (source.find(it.key()) == source.end())
|
|
|
{
|
|
|
// found a key that is not in this -> add it
|
|
|
- const auto path_key = detail::concat(path, '/', detail::escape(it.key()));
|
|
|
+ const auto path_key = detail::concat<string_t>(path, '/', detail::escape(it.key()));
|
|
|
result.push_back(
|
|
|
{
|
|
|
{"op", "add"}, {"path", path_key},
|