3 __| | __| | | | JSON for Modern C++
4 | | |__ | | | | | | version 2.1.1
5 |_____|_____|_____|_|___| https://github.com/nlohmann/json
7 Licensed under the MIT License <http://opensource.org/licenses/MIT>.
8 Copyright (c) 2013-2017 Niels Lohmann <http://nlohmann.me>.
10 Permission is hereby granted, free of charge, to any person obtaining a copy
11 of this software and associated documentation files (the "Software"), to deal
12 in the Software without restriction, including without limitation the rights
13 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 copies of the Software, and to permit persons to whom the Software is
15 furnished to do so, subject to the following conditions:
17 The above copyright notice and this permission notice shall be included in all
18 copies or substantial portions of the Software.
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 #ifndef NLOHMANN_JSON_HPP
30 #define NLOHMANN_JSON_HPP
32 #include <algorithm> // all_of, copy, fill, find, for_each, none_of, remove, reverse, transform
33 #include <array> // array
34 #include <cassert> // assert
35 #include <cctype> // isdigit
36 #include <ciso646> // and, not, or
37 #include <cmath> // isfinite, labs, ldexp, signbit
38 #include <cstddef> // nullptr_t, ptrdiff_t, size_t
39 #include <cstdint> // int64_t, uint64_t
40 #include <cstdlib> // abort, strtod, strtof, strtold, strtoul, strtoll, strtoull
41 #include <cstring> // strlen
42 #include <forward_list> // forward_list
43 #include <functional> // function, hash, less
44 #include <initializer_list> // initializer_list
45 #include <iomanip> // setw
46 #include <iostream> // istream, ostream
47 #include <iterator> // advance, begin, back_inserter, bidirectional_iterator_tag, distance, end, inserter, iterator, iterator_traits, next, random_access_iterator_tag, reverse_iterator
48 #include <limits> // numeric_limits
49 #include <locale> // locale
51 #include <memory> // addressof, allocator, allocator_traits, unique_ptr
52 #include <numeric> // accumulate
53 #include <sstream> // stringstream
54 #include <stdexcept> // domain_error, invalid_argument, out_of_range
55 #include <string> // getline, stoi, string, to_string
56 #include <type_traits> // add_pointer, conditional, decay, enable_if, false_type, integral_constant, is_arithmetic, is_base_of, is_const, is_constructible, is_convertible, is_default_constructible, is_enum, is_floating_point, is_integral, is_nothrow_move_assignable, is_nothrow_move_constructible, is_pointer, is_reference, is_same, is_scalar, is_signed, remove_const, remove_cv, remove_pointer, remove_reference, true_type, underlying_type
57 #include <utility> // declval, forward, make_pair, move, pair, swap
58 #include <vector> // vector
60 // exclude unsupported compilers
61 #if defined(__clang__)
62 #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
63 #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
65 #elif defined(__GNUC__)
66 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900
67 #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
71 // disable float-equal warnings on GCC/clang
72 #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
73 #pragma GCC diagnostic push
74 #pragma GCC diagnostic ignored "-Wfloat-equal"
77 // disable documentation warnings on clang
78 #if defined(__clang__)
79 #pragma GCC diagnostic push
80 #pragma GCC diagnostic ignored "-Wdocumentation"
83 // allow for portable deprecation warnings
84 #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
85 #define JSON_DEPRECATED __attribute__((deprecated))
86 #elif defined(_MSC_VER)
87 #define JSON_DEPRECATED __declspec(deprecated)
89 #define JSON_DEPRECATED
92 // allow to disable exceptions
93 #if not defined(JSON_NOEXCEPTION) || defined(__EXCEPTIONS)
94 #define JSON_THROW(exception) throw exception
96 #define JSON_CATCH(exception) catch(exception)
98 #define JSON_THROW(exception) std::abort()
99 #define JSON_TRY if(true)
100 #define JSON_CATCH(exception) if(false)
104 @brief namespace for Niels Lohmann
105 @see https://github.com/nlohmann
112 @brief unnamed namespace with internal helper functions
114 This namespace collects some functions that could not be defined inside the
115 @ref basic_json class.
121 ///////////////////////////
122 // JSON type enumeration //
123 ///////////////////////////
126 @brief the JSON type enumeration
128 This enumeration collects the different JSON types. It is internally used to
129 distinguish the stored values, and the functions @ref basic_json::is_null(),
130 @ref basic_json::is_object(), @ref basic_json::is_array(),
131 @ref basic_json::is_string(), @ref basic_json::is_boolean(),
132 @ref basic_json::is_number() (with @ref basic_json::is_number_integer(),
133 @ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()),
134 @ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and
135 @ref basic_json::is_structured() rely on it.
137 @note There are three enumeration entries (number_integer, number_unsigned, and
138 number_float), because the library distinguishes these three types for numbers:
139 @ref basic_json::number_unsigned_t is used for unsigned integers,
140 @ref basic_json::number_integer_t is used for signed integers, and
141 @ref basic_json::number_float_t is used for floating-point numbers or to
142 approximate integers which do not fit in the limits of their respective type.
144 @sa @ref basic_json::basic_json(const value_t value_type) -- create a JSON
145 value with the default value for a given type
149 enum class value_t : uint8_t
151 null, ///< null value
152 object, ///< object (unordered set of name/value pairs)
153 array, ///< array (ordered collection of values)
154 string, ///< string value
155 boolean, ///< boolean value
156 number_integer, ///< number value (signed integer)
157 number_unsigned, ///< number value (unsigned integer)
158 number_float, ///< number value (floating-point)
159 discarded ///< discarded by the the parser callback function
163 @brief comparison operator for JSON types
165 Returns an ordering that is similar to Python:
166 - order: null < boolean < number < object < array < string
167 - furthermore, each type is not smaller than itself
171 inline bool operator<(const value_t lhs, const value_t rhs) noexcept
173 static constexpr std::array<uint8_t, 8> order = {{
185 // discarded values are not comparable
186 if (lhs == value_t::discarded or rhs == value_t::discarded)
191 return order[static_cast<std::size_t>(lhs)] <
192 order[static_cast<std::size_t>(rhs)];
200 // alias templates to reduce boilerplate
201 template<bool B, typename T = void>
202 using enable_if_t = typename std::enable_if<B, T>::type;
205 using uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
207 // taken from http://stackoverflow.com/a/26936864/266378
209 using is_unscoped_enum =
210 std::integral_constant<bool, std::is_convertible<T, int>::value and
211 std::is_enum<T>::value>;
214 Implementation of two C++17 constructs: conjunction, negation. This is needed
215 to avoid evaluating all the traits in a condition
217 For example: not std::is_same<void, T>::value and has_value_type<T>::value
218 will not compile when T = void (on MSVC at least). Whereas
219 conjunction<negation<std::is_same<void, T>>, has_value_type<T>>::value will
220 stop evaluating if negation<...>::value == false
222 Please note that those constructs must be used with caution, since symbols can
223 become very long quickly (which can slow down compilation and cause MSVC
224 internal compiler errors). Only use it when you have to (see example ahead).
226 template<class...> struct conjunction : std::true_type {};
227 template<class B1> struct conjunction<B1> : B1 {};
228 template<class B1, class... Bn>
229 struct conjunction<B1, Bn...> : std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};
231 template<class B> struct negation : std::integral_constant < bool, !B::value > {};
233 // dispatch utility (taken from ranges-v3)
234 template<unsigned N> struct priority_tag : priority_tag < N - 1 > {};
235 template<> struct priority_tag<0> {};
242 template<value_t> struct external_constructor;
245 struct external_constructor<value_t::boolean>
247 template<typename BasicJsonType>
248 static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept
250 j.m_type = value_t::boolean;
252 j.assert_invariant();
257 struct external_constructor<value_t::string>
259 template<typename BasicJsonType>
260 static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s)
262 j.m_type = value_t::string;
264 j.assert_invariant();
269 struct external_constructor<value_t::number_float>
271 template<typename BasicJsonType>
272 static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept
274 // replace infinity and NAN by null
275 if (not std::isfinite(val))
281 j.m_type = value_t::number_float;
284 j.assert_invariant();
289 struct external_constructor<value_t::number_unsigned>
291 template<typename BasicJsonType>
292 static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept
294 j.m_type = value_t::number_unsigned;
296 j.assert_invariant();
301 struct external_constructor<value_t::number_integer>
303 template<typename BasicJsonType>
304 static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept
306 j.m_type = value_t::number_integer;
308 j.assert_invariant();
313 struct external_constructor<value_t::array>
315 template<typename BasicJsonType>
316 static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr)
318 j.m_type = value_t::array;
320 j.assert_invariant();
323 template<typename BasicJsonType, typename CompatibleArrayType,
324 enable_if_t<not std::is_same<CompatibleArrayType,
325 typename BasicJsonType::array_t>::value,
327 static void construct(BasicJsonType& j, const CompatibleArrayType& arr)
331 j.m_type = value_t::array;
332 j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
333 j.assert_invariant();
338 struct external_constructor<value_t::object>
340 template<typename BasicJsonType>
341 static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj)
343 j.m_type = value_t::object;
345 j.assert_invariant();
348 template<typename BasicJsonType, typename CompatibleObjectType,
349 enable_if_t<not std::is_same<CompatibleObjectType,
350 typename BasicJsonType::object_t>::value,
352 static void construct(BasicJsonType& j, const CompatibleObjectType& obj)
357 j.m_type = value_t::object;
358 j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
359 j.assert_invariant();
364 ////////////////////////
365 // has_/is_ functions //
366 ////////////////////////
369 @brief Helper to determine whether there's a key_type for T.
371 This helper is used to tell associative containers apart from other containers
372 such as sequence containers. For instance, `std::map` passes the test as it
373 contains a `mapped_type`, whereas `std::vector` fails the test.
375 @sa http://stackoverflow.com/a/7728728/266378
376 @since version 1.0.0, overworked in version 2.0.6
378 #define NLOHMANN_JSON_HAS_HELPER(type) \
379 template<typename T> struct has_##type { \
381 template<typename U, typename = typename U::type> \
382 static int detect(U &&); \
383 static void detect(...); \
385 static constexpr bool value = \
386 std::is_integral<decltype(detect(std::declval<T>()))>::value; \
389 NLOHMANN_JSON_HAS_HELPER(mapped_type);
390 NLOHMANN_JSON_HAS_HELPER(key_type);
391 NLOHMANN_JSON_HAS_HELPER(value_type);
392 NLOHMANN_JSON_HAS_HELPER(iterator);
394 #undef NLOHMANN_JSON_HAS_HELPER
397 template<bool B, class RealType, class CompatibleObjectType>
398 struct is_compatible_object_type_impl : std::false_type {};
400 template<class RealType, class CompatibleObjectType>
401 struct is_compatible_object_type_impl<true, RealType, CompatibleObjectType>
403 static constexpr auto value =
404 std::is_constructible<typename RealType::key_type,
405 typename CompatibleObjectType::key_type>::value and
406 std::is_constructible<typename RealType::mapped_type,
407 typename CompatibleObjectType::mapped_type>::value;
410 template<class BasicJsonType, class CompatibleObjectType>
411 struct is_compatible_object_type
413 static auto constexpr value = is_compatible_object_type_impl <
414 conjunction<negation<std::is_same<void, CompatibleObjectType>>,
415 has_mapped_type<CompatibleObjectType>,
416 has_key_type<CompatibleObjectType>>::value,
417 typename BasicJsonType::object_t, CompatibleObjectType >::value;
420 template<typename BasicJsonType, typename T>
421 struct is_basic_json_nested_type
423 static auto constexpr value = std::is_same<T, typename BasicJsonType::iterator>::value or
424 std::is_same<T, typename BasicJsonType::const_iterator>::value or
425 std::is_same<T, typename BasicJsonType::reverse_iterator>::value or
426 std::is_same<T, typename BasicJsonType::const_reverse_iterator>::value or
427 std::is_same<T, typename BasicJsonType::json_pointer>::value;
430 template<class BasicJsonType, class CompatibleArrayType>
431 struct is_compatible_array_type
433 static auto constexpr value =
434 conjunction<negation<std::is_same<void, CompatibleArrayType>>,
435 negation<is_compatible_object_type<
436 BasicJsonType, CompatibleArrayType>>,
437 negation<std::is_constructible<typename BasicJsonType::string_t,
438 CompatibleArrayType>>,
439 negation<is_basic_json_nested_type<BasicJsonType, CompatibleArrayType>>,
440 has_value_type<CompatibleArrayType>,
441 has_iterator<CompatibleArrayType>>::value;
444 template<bool, typename, typename>
445 struct is_compatible_integer_type_impl : std::false_type {};
447 template<typename RealIntegerType, typename CompatibleNumberIntegerType>
448 struct is_compatible_integer_type_impl<true, RealIntegerType, CompatibleNumberIntegerType>
450 // is there an assert somewhere on overflows?
451 using RealLimits = std::numeric_limits<RealIntegerType>;
452 using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;
454 static constexpr auto value =
455 std::is_constructible<RealIntegerType,
456 CompatibleNumberIntegerType>::value and
457 CompatibleLimits::is_integer and
458 RealLimits::is_signed == CompatibleLimits::is_signed;
461 template<typename RealIntegerType, typename CompatibleNumberIntegerType>
462 struct is_compatible_integer_type
464 static constexpr auto value =
465 is_compatible_integer_type_impl <
466 std::is_integral<CompatibleNumberIntegerType>::value and
467 not std::is_same<bool, CompatibleNumberIntegerType>::value,
468 RealIntegerType, CompatibleNumberIntegerType > ::value;
472 // trait checking if JSONSerializer<T>::from_json(json const&, udt&) exists
473 template<typename BasicJsonType, typename T>
477 // also check the return type of from_json
478 template<typename U, typename = enable_if_t<std::is_same<void, decltype(uncvref_t<U>::from_json(
479 std::declval<BasicJsonType>(), std::declval<T&>()))>::value>>
480 static int detect(U&&);
481 static void detect(...);
484 static constexpr bool value = std::is_integral<decltype(
485 detect(std::declval<typename BasicJsonType::template json_serializer<T, void>>()))>::value;
488 // This trait checks if JSONSerializer<T>::from_json(json const&) exists
489 // this overload is used for non-default-constructible user-defined-types
490 template<typename BasicJsonType, typename T>
491 struct has_non_default_from_json
496 typename = enable_if_t<std::is_same<
497 T, decltype(uncvref_t<U>::from_json(std::declval<BasicJsonType>()))>::value >>
498 static int detect(U&&);
499 static void detect(...);
502 static constexpr bool value = std::is_integral<decltype(detect(
503 std::declval<typename BasicJsonType::template json_serializer<T, void>>()))>::value;
506 // This trait checks if BasicJsonType::json_serializer<T>::to_json exists
507 template<typename BasicJsonType, typename T>
511 template<typename U, typename = decltype(uncvref_t<U>::to_json(
512 std::declval<BasicJsonType&>(), std::declval<T>()))>
513 static int detect(U&&);
514 static void detect(...);
517 static constexpr bool value = std::is_integral<decltype(detect(
518 std::declval<typename BasicJsonType::template json_serializer<T, void>>()))>::value;
526 template<typename BasicJsonType, typename T, enable_if_t<
527 std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0>
528 void to_json(BasicJsonType& j, T b) noexcept
530 external_constructor<value_t::boolean>::construct(j, b);
533 template<typename BasicJsonType, typename CompatibleString,
534 enable_if_t<std::is_constructible<typename BasicJsonType::string_t,
535 CompatibleString>::value, int> = 0>
536 void to_json(BasicJsonType& j, const CompatibleString& s)
538 external_constructor<value_t::string>::construct(j, s);
541 template<typename BasicJsonType, typename FloatType,
542 enable_if_t<std::is_floating_point<FloatType>::value, int> = 0>
543 void to_json(BasicJsonType& j, FloatType val) noexcept
545 external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));
549 typename BasicJsonType, typename CompatibleNumberUnsignedType,
550 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t,
551 CompatibleNumberUnsignedType>::value, int> = 0 >
552 void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept
554 external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));
558 typename BasicJsonType, typename CompatibleNumberIntegerType,
559 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t,
560 CompatibleNumberIntegerType>::value, int> = 0 >
561 void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept
563 external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));
566 template<typename BasicJsonType, typename UnscopedEnumType,
567 enable_if_t<is_unscoped_enum<UnscopedEnumType>::value, int> = 0>
568 void to_json(BasicJsonType& j, UnscopedEnumType e) noexcept
570 external_constructor<value_t::number_integer>::construct(j, e);
574 typename BasicJsonType, typename CompatibleArrayType,
576 is_compatible_array_type<BasicJsonType, CompatibleArrayType>::value or
577 std::is_same<typename BasicJsonType::array_t, CompatibleArrayType>::value,
579 void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
581 external_constructor<value_t::array>::construct(j, arr);
585 typename BasicJsonType, typename CompatibleObjectType,
586 enable_if_t<is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value,
588 void to_json(BasicJsonType& j, const CompatibleObjectType& arr)
590 external_constructor<value_t::object>::construct(j, arr);
598 // overloads for basic_json template parameters
599 template<typename BasicJsonType, typename ArithmeticType,
600 enable_if_t<std::is_arithmetic<ArithmeticType>::value and
601 not std::is_same<ArithmeticType,
602 typename BasicJsonType::boolean_t>::value,
604 void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
606 switch (static_cast<value_t>(j))
608 case value_t::number_unsigned:
610 val = static_cast<ArithmeticType>(
611 *j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
614 case value_t::number_integer:
616 val = static_cast<ArithmeticType>(
617 *j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
620 case value_t::number_float:
622 val = static_cast<ArithmeticType>(
623 *j.template get_ptr<const typename BasicJsonType::number_float_t*>());
629 std::domain_error("type must be number, but is " + j.type_name()));
634 template<typename BasicJsonType>
635 void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)
637 if (not j.is_boolean())
639 JSON_THROW(std::domain_error("type must be boolean, but is " + j.type_name()));
641 b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();
644 template<typename BasicJsonType>
645 void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s)
647 if (not j.is_string())
649 JSON_THROW(std::domain_error("type must be string, but is " + j.type_name()));
651 s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
654 template<typename BasicJsonType>
655 void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val)
657 get_arithmetic_value(j, val);
660 template<typename BasicJsonType>
661 void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val)
663 get_arithmetic_value(j, val);
666 template<typename BasicJsonType>
667 void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val)
669 get_arithmetic_value(j, val);
672 template<typename BasicJsonType, typename UnscopedEnumType,
673 enable_if_t<is_unscoped_enum<UnscopedEnumType>::value, int> = 0>
674 void from_json(const BasicJsonType& j, UnscopedEnumType& e)
676 typename std::underlying_type<UnscopedEnumType>::type val;
677 get_arithmetic_value(j, val);
678 e = static_cast<UnscopedEnumType>(val);
681 template<typename BasicJsonType>
682 void from_json(const BasicJsonType& j, typename BasicJsonType::array_t& arr)
684 if (not j.is_array())
686 JSON_THROW(std::domain_error("type must be array, but is " + j.type_name()));
688 arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();
691 // forward_list doesn't have an insert method
692 template<typename BasicJsonType, typename T, typename Allocator>
693 void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)
695 // do not perform the check when user wants to retrieve jsons
696 // (except when it's null.. ?)
699 JSON_THROW(std::domain_error("type must be array, but is " + j.type_name()));
701 if (not std::is_same<T, BasicJsonType>::value)
703 if (not j.is_array())
705 JSON_THROW(std::domain_error("type must be array, but is " + j.type_name()));
708 for (auto it = j.rbegin(), end = j.rend(); it != end; ++it)
710 l.push_front(it->template get<T>());
714 template<typename BasicJsonType, typename CompatibleArrayType>
715 void from_json_array_impl(const BasicJsonType& j, CompatibleArrayType& arr, priority_tag<0>)
720 std::transform(j.begin(), j.end(),
721 std::inserter(arr, end(arr)), [](const BasicJsonType & i)
723 // get<BasicJsonType>() returns *this, this won't call a from_json
724 // method when value_type is BasicJsonType
725 return i.template get<typename CompatibleArrayType::value_type>();
729 template<typename BasicJsonType, typename CompatibleArrayType>
730 auto from_json_array_impl(const BasicJsonType& j, CompatibleArrayType& arr, priority_tag<1>)
732 arr.reserve(std::declval<typename CompatibleArrayType::size_type>()),
738 arr.reserve(j.size());
740 j.begin(), j.end(), std::inserter(arr, end(arr)), [](const BasicJsonType & i)
742 // get<BasicJsonType>() returns *this, this won't call a from_json
743 // method when value_type is BasicJsonType
744 return i.template get<typename CompatibleArrayType::value_type>();
748 template<typename BasicJsonType, typename CompatibleArrayType,
749 enable_if_t<is_compatible_array_type<BasicJsonType, CompatibleArrayType>::value and
750 not std::is_same<typename BasicJsonType::array_t, CompatibleArrayType>::value, int> = 0>
751 void from_json(const BasicJsonType& j, CompatibleArrayType& arr)
755 JSON_THROW(std::domain_error("type must be array, but is " + j.type_name()));
758 // when T == BasicJsonType, do not check if value_t is correct
759 if (not std::is_same<typename CompatibleArrayType::value_type, BasicJsonType>::value)
761 if (not j.is_array())
763 JSON_THROW(std::domain_error("type must be array, but is " + j.type_name()));
766 from_json_array_impl(j, arr, priority_tag<1> {});
769 template<typename BasicJsonType, typename CompatibleObjectType,
770 enable_if_t<is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value, int> = 0>
771 void from_json(const BasicJsonType& j, CompatibleObjectType& obj)
773 if (not j.is_object())
775 JSON_THROW(std::domain_error("type must be object, but is " + j.type_name()));
778 auto inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();
781 // we could avoid the assignment, but this might require a for loop, which
782 // might be less efficient than the container constructor for some
783 // containers (would it?)
784 obj = CompatibleObjectType(begin(*inner_object), end(*inner_object));
787 // overload for arithmetic types, not chosen for basic_json template arguments
788 // (BooleanType, etc..); note: Is it really necessary to provide explicit
789 // overloads for boolean_t etc. in case of a custom BooleanType which is not
790 // an arithmetic type?
791 template<typename BasicJsonType, typename ArithmeticType,
793 std::is_arithmetic<ArithmeticType>::value and
794 not std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value and
795 not std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value and
796 not std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value and
797 not std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
799 void from_json(const BasicJsonType& j, ArithmeticType& val)
801 switch (static_cast<value_t>(j))
803 case value_t::number_unsigned:
805 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
808 case value_t::number_integer:
810 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
813 case value_t::number_float:
815 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
818 case value_t::boolean:
820 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());
825 JSON_THROW(std::domain_error("type must be number, but is " + j.type_name()));
833 template<typename BasicJsonType, typename T>
834 auto call(BasicJsonType& j, T&& val, priority_tag<1>) const noexcept(noexcept(to_json(j, std::forward<T>(val))))
835 -> decltype(to_json(j, std::forward<T>(val)), void())
837 return to_json(j, std::forward<T>(val));
840 template<typename BasicJsonType, typename T>
841 void call(BasicJsonType&, T&&, priority_tag<0>) const noexcept
843 static_assert(sizeof(BasicJsonType) == 0,
844 "could not find to_json() method in T's namespace");
848 template<typename BasicJsonType, typename T>
849 void operator()(BasicJsonType& j, T&& val) const
850 noexcept(noexcept(std::declval<to_json_fn>().call(j, std::forward<T>(val), priority_tag<1> {})))
852 return call(j, std::forward<T>(val), priority_tag<1> {});
859 template<typename BasicJsonType, typename T>
860 auto call(const BasicJsonType& j, T& val, priority_tag<1>) const
861 noexcept(noexcept(from_json(j, val)))
862 -> decltype(from_json(j, val), void())
864 return from_json(j, val);
867 template<typename BasicJsonType, typename T>
868 void call(const BasicJsonType&, T&, priority_tag<0>) const noexcept
870 static_assert(sizeof(BasicJsonType) == 0,
871 "could not find from_json() method in T's namespace");
875 template<typename BasicJsonType, typename T>
876 void operator()(const BasicJsonType& j, T& val) const
877 noexcept(noexcept(std::declval<from_json_fn>().call(j, val, priority_tag<1> {})))
879 return call(j, val, priority_tag<1> {});
883 // taken from ranges-v3
887 static constexpr T value{};
891 constexpr T static_const<T>::value;
892 } // namespace detail
895 /// namespace to hold default `to_json` / `from_json` functions
898 constexpr const auto& to_json = detail::static_const<detail::to_json_fn>::value;
899 constexpr const auto& from_json = detail::static_const<detail::from_json_fn>::value;
904 @brief default JSONSerializer template argument
906 This serializer ignores the template arguments and uses ADL
907 ([argument-dependent lookup](http://en.cppreference.com/w/cpp/language/adl))
910 template<typename = void, typename = void>
911 struct adl_serializer
914 @brief convert a JSON value to any value type
916 This function is usually called by the `get()` function of the
917 @ref basic_json class (either explicit or via conversion operators).
919 @param[in] j JSON value to read from
920 @param[in,out] val value to write to
922 template<typename BasicJsonType, typename ValueType>
923 static void from_json(BasicJsonType&& j, ValueType& val) noexcept(
924 noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))
926 ::nlohmann::from_json(std::forward<BasicJsonType>(j), val);
930 @brief convert any value type to a JSON value
932 This function is usually called by the constructors of the @ref basic_json
935 @param[in,out] j JSON value to write to
936 @param[in] val value to read from
938 template<typename BasicJsonType, typename ValueType>
939 static void to_json(BasicJsonType& j, ValueType&& val) noexcept(
940 noexcept(::nlohmann::to_json(j, std::forward<ValueType>(val))))
942 ::nlohmann::to_json(j, std::forward<ValueType>(val));
948 @brief a class to store JSON values
950 @tparam ObjectType type for JSON objects (`std::map` by default; will be used
952 @tparam ArrayType type for JSON arrays (`std::vector` by default; will be used
954 @tparam StringType type for JSON strings and object keys (`std::string` by
955 default; will be used in @ref string_t)
956 @tparam BooleanType type for JSON booleans (`bool` by default; will be used
958 @tparam NumberIntegerType type for JSON integer numbers (`int64_t` by
959 default; will be used in @ref number_integer_t)
960 @tparam NumberUnsignedType type for JSON unsigned integer numbers (@c
961 `uint64_t` by default; will be used in @ref number_unsigned_t)
962 @tparam NumberFloatType type for JSON floating-point numbers (`double` by
963 default; will be used in @ref number_float_t)
964 @tparam AllocatorType type of the allocator to use (`std::allocator` by
966 @tparam JSONSerializer the serializer to resolve internal calls to `to_json()`
967 and `from_json()` (@ref adl_serializer by default)
969 @requirement The class satisfies the following concept requirements:
971 - [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible):
972 JSON values can be default constructed. The result will be a JSON null
974 - [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible):
975 A JSON value can be constructed from an rvalue argument.
976 - [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible):
977 A JSON value can be copy-constructed from an lvalue expression.
978 - [MoveAssignable](http://en.cppreference.com/w/cpp/concept/MoveAssignable):
979 A JSON value van be assigned from an rvalue argument.
980 - [CopyAssignable](http://en.cppreference.com/w/cpp/concept/CopyAssignable):
981 A JSON value can be copy-assigned from an lvalue expression.
982 - [Destructible](http://en.cppreference.com/w/cpp/concept/Destructible):
983 JSON values can be destructed.
985 - [StandardLayoutType](http://en.cppreference.com/w/cpp/concept/StandardLayoutType):
987 [standard layout](http://en.cppreference.com/w/cpp/language/data_members#Standard_layout):
988 All non-static data members are private and standard layout types, the
989 class has no virtual functions or (virtual) base classes.
991 - [EqualityComparable](http://en.cppreference.com/w/cpp/concept/EqualityComparable):
992 JSON values can be compared with `==`, see @ref
993 operator==(const_reference,const_reference).
994 - [LessThanComparable](http://en.cppreference.com/w/cpp/concept/LessThanComparable):
995 JSON values can be compared with `<`, see @ref
996 operator<(const_reference,const_reference).
997 - [Swappable](http://en.cppreference.com/w/cpp/concept/Swappable):
998 Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of
999 other compatible types, using unqualified function call @ref swap().
1000 - [NullablePointer](http://en.cppreference.com/w/cpp/concept/NullablePointer):
1001 JSON values can be compared against `std::nullptr_t` objects which are used
1002 to model the `null` value.
1004 - [Container](http://en.cppreference.com/w/cpp/concept/Container):
1005 JSON values can be used like STL containers and provide iterator access.
1006 - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer);
1007 JSON values can be used like STL containers and provide reverse iterator
1010 @invariant The member variables @a m_value and @a m_type have the following
1012 - If `m_type == value_t::object`, then `m_value.object != nullptr`.
1013 - If `m_type == value_t::array`, then `m_value.array != nullptr`.
1014 - If `m_type == value_t::string`, then `m_value.string != nullptr`.
1015 The invariants are checked by member function assert_invariant().
1018 @note ObjectType trick from http://stackoverflow.com/a/9860911
1021 @see [RFC 7159: The JavaScript Object Notation (JSON) Data Interchange
1022 Format](http://rfc7159.net/rfc7159)
1024 @since version 1.0.0
1029 template<typename U, typename V, typename... Args> class ObjectType = std::map,
1030 template<typename U, typename... Args> class ArrayType = std::vector,
1031 class StringType = std::string,
1032 class BooleanType = bool,
1033 class NumberIntegerType = std::int64_t,
1034 class NumberUnsignedType = std::uint64_t,
1035 class NumberFloatType = double,
1036 template<typename U> class AllocatorType = std::allocator,
1037 template<typename T, typename SFINAE = void> class JSONSerializer = adl_serializer
1042 template<detail::value_t> friend struct detail::external_constructor;
1043 /// workaround type for MSVC
1044 using basic_json_t = basic_json<ObjectType, ArrayType, StringType,
1045 BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType,
1046 AllocatorType, JSONSerializer>;
1049 using value_t = detail::value_t;
1050 // forward declarations
1051 template<typename U> class iter_impl;
1052 template<typename Base> class json_reverse_iterator;
1054 template<typename T, typename SFINAE>
1055 using json_serializer = JSONSerializer<T, SFINAE>;
1057 /////////////////////
1058 // container types //
1059 /////////////////////
1061 /// @name container types
1062 /// The canonic container types to use @ref basic_json like any other STL
1066 /// the type of elements in a basic_json container
1067 using value_type = basic_json;
1069 /// the type of an element reference
1070 using reference = value_type&;
1071 /// the type of an element const reference
1072 using const_reference = const value_type&;
1074 /// a type to represent differences between iterators
1075 using difference_type = std::ptrdiff_t;
1076 /// a type to represent container sizes
1077 using size_type = std::size_t;
1079 /// the allocator type
1080 using allocator_type = AllocatorType<basic_json>;
1082 /// the type of an element pointer
1083 using pointer = typename std::allocator_traits<allocator_type>::pointer;
1084 /// the type of an element const pointer
1085 using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;
1087 /// an iterator for a basic_json container
1088 using iterator = iter_impl<basic_json>;
1089 /// a const iterator for a basic_json container
1090 using const_iterator = iter_impl<const basic_json>;
1091 /// a reverse iterator for a basic_json container
1092 using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>;
1093 /// a const reverse iterator for a basic_json container
1094 using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>;
1100 @brief returns the allocator associated with the container
1102 static allocator_type get_allocator()
1104 return allocator_type();
1108 @brief returns version information on the library
1110 This function returns a JSON object with information about the library,
1111 including the version number and information on the platform and compiler.
1113 @return JSON object holding version information
1115 ----------- | ---------------
1116 `compiler` | Information on the used compiler. It is an object with the following keys: `c++` (the used C++ standard), `family` (the compiler family; possible values are `clang`, `icc`, `gcc`, `ilecpp`, `msvc`, `pgcpp`, `sunpro`, and `unknown`), and `version` (the compiler version).
1117 `copyright` | The copyright line for the library as string.
1118 `name` | The name of the library as string.
1119 `platform` | The used platform as string. Possible values are `win32`, `linux`, `apple`, `unix`, and `unknown`.
1120 `url` | The URL of the project as string.
1121 `version` | The version of the library. It is an object with the following keys: `major`, `minor`, and `patch` as defined by [Semantic Versioning](http://semver.org), and `string` (the version string).
1123 @liveexample{The following code shows an example output of the `meta()`
1126 @complexity Constant.
1130 static basic_json meta()
1134 result["copyright"] = "(C) 2013-2017 Niels Lohmann";
1135 result["name"] = "JSON for Modern C++";
1136 result["url"] = "https://github.com/nlohmann/json";
1139 {"string", "2.1.1"},
1146 result["platform"] = "win32";
1147 #elif defined __linux__
1148 result["platform"] = "linux";
1149 #elif defined __APPLE__
1150 result["platform"] = "apple";
1151 #elif defined __unix__
1152 result["platform"] = "unix";
1154 result["platform"] = "unknown";
1157 #if defined(__clang__)
1158 result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}};
1159 #elif defined(__ICC) || defined(__INTEL_COMPILER)
1160 result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}};
1161 #elif defined(__GNUC__) || defined(__GNUG__)
1162 result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}};
1163 #elif defined(__HP_cc) || defined(__HP_aCC)
1164 result["compiler"] = "hp"
1165 #elif defined(__IBMCPP__)
1166 result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}};
1167 #elif defined(_MSC_VER)
1168 result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}};
1169 #elif defined(__PGI)
1170 result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}};
1171 #elif defined(__SUNPRO_CC)
1172 result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}};
1174 result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}};
1178 result["compiler"]["c++"] = std::to_string(__cplusplus);
1180 result["compiler"]["c++"] = "unknown";
1186 ///////////////////////////
1187 // JSON value data types //
1188 ///////////////////////////
1190 /// @name JSON value data types
1191 /// The data types to store a JSON value. These types are derived from
1192 /// the template arguments passed to class @ref basic_json.
1196 @brief a type for an object
1198 [RFC 7159](http://rfc7159.net/rfc7159) describes JSON objects as follows:
1199 > An object is an unordered collection of zero or more name/value pairs,
1200 > where a name is a string and a value is a string, number, boolean, null,
1203 To store objects in C++, a type is defined by the template parameters
1206 @tparam ObjectType the container to store objects (e.g., `std::map` or
1207 `std::unordered_map`)
1208 @tparam StringType the type of the keys or names (e.g., `std::string`).
1209 The comparison function `std::less<StringType>` is used to order elements
1210 inside the container.
1211 @tparam AllocatorType the allocator to use for objects (e.g.,
1216 With the default values for @a ObjectType (`std::map`), @a StringType
1217 (`std::string`), and @a AllocatorType (`std::allocator`), the default
1218 value for @a object_t is:
1222 std::string, // key_type
1223 basic_json, // value_type
1224 std::less<std::string>, // key_compare
1225 std::allocator<std::pair<const std::string, basic_json>> // allocator_type
1231 The choice of @a object_t influences the behavior of the JSON class. With
1232 the default type, objects have the following behavior:
1234 - When all names are unique, objects will be interoperable in the sense
1235 that all software implementations receiving that object will agree on
1236 the name-value mappings.
1237 - When the names within an object are not unique, later stored name/value
1238 pairs overwrite previously stored name/value pairs, leaving the used
1239 names unique. For instance, `{"key": 1}` and `{"key": 2, "key": 1}` will
1240 be treated as equal and both stored as `{"key": 1}`.
1241 - Internally, name/value pairs are stored in lexicographical order of the
1242 names. Objects will also be serialized (see @ref dump) in this order.
1243 For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored
1244 and serialized as `{"a": 2, "b": 1}`.
1245 - When comparing objects, the order of the name/value pairs is irrelevant.
1246 This makes objects interoperable in the sense that they will not be
1247 affected by these differences. For instance, `{"b": 1, "a": 2}` and
1248 `{"a": 2, "b": 1}` will be treated as equal.
1252 [RFC 7159](http://rfc7159.net/rfc7159) specifies:
1253 > An implementation may set limits on the maximum depth of nesting.
1255 In this class, the object's limit of nesting is not constraint explicitly.
1256 However, a maximum depth of nesting may be introduced by the compiler or
1257 runtime environment. A theoretical limit can be queried by calling the
1258 @ref max_size function of a JSON object.
1262 Objects are stored as pointers in a @ref basic_json type. That is, for any
1263 access to object values, a pointer of type `object_t*` must be
1266 @sa @ref array_t -- type for an array value
1268 @since version 1.0.0
1270 @note The order name/value pairs are added to the object is *not*
1271 preserved by the library. Therefore, iterating an object may return
1272 name/value pairs in a different order than they were originally stored. In
1273 fact, keys will be traversed in alphabetical order as `std::map` with
1274 `std::less` is used by default. Please note this behavior conforms to [RFC
1275 7159](http://rfc7159.net/rfc7159), because any order implements the
1276 specified "unordered" nature of JSON objects.
1278 using object_t = ObjectType<StringType,
1280 std::less<StringType>,
1281 AllocatorType<std::pair<const StringType,
1285 @brief a type for an array
1287 [RFC 7159](http://rfc7159.net/rfc7159) describes JSON arrays as follows:
1288 > An array is an ordered sequence of zero or more values.
1290 To store objects in C++, a type is defined by the template parameters
1293 @tparam ArrayType container type to store arrays (e.g., `std::vector` or
1295 @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`)
1299 With the default values for @a ArrayType (`std::vector`) and @a
1300 AllocatorType (`std::allocator`), the default value for @a array_t is:
1304 basic_json, // value_type
1305 std::allocator<basic_json> // allocator_type
1311 [RFC 7159](http://rfc7159.net/rfc7159) specifies:
1312 > An implementation may set limits on the maximum depth of nesting.
1314 In this class, the array's limit of nesting is not constraint explicitly.
1315 However, a maximum depth of nesting may be introduced by the compiler or
1316 runtime environment. A theoretical limit can be queried by calling the
1317 @ref max_size function of a JSON array.
1321 Arrays are stored as pointers in a @ref basic_json type. That is, for any
1322 access to array values, a pointer of type `array_t*` must be dereferenced.
1324 @sa @ref object_t -- type for an object value
1326 @since version 1.0.0
1328 using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;
1331 @brief a type for a string
1333 [RFC 7159](http://rfc7159.net/rfc7159) describes JSON strings as follows:
1334 > A string is a sequence of zero or more Unicode characters.
1336 To store objects in C++, a type is defined by the template parameter
1337 described below. Unicode values are split by the JSON class into
1338 byte-sized characters during deserialization.
1340 @tparam StringType the container to store strings (e.g., `std::string`).
1341 Note this container is used for keys/names in objects, see @ref object_t.
1345 With the default values for @a StringType (`std::string`), the default
1346 value for @a string_t is:
1354 Strings are stored in UTF-8 encoding. Therefore, functions like
1355 `std::string::size()` or `std::string::length()` return the number of
1356 bytes in the string rather than the number of characters or glyphs.
1358 #### String comparison
1360 [RFC 7159](http://rfc7159.net/rfc7159) states:
1361 > Software implementations are typically required to test names of object
1362 > members for equality. Implementations that transform the textual
1363 > representation into sequences of Unicode code units and then perform the
1364 > comparison numerically, code unit by code unit, are interoperable in the
1365 > sense that implementations will agree in all cases on equality or
1366 > inequality of two strings. For example, implementations that compare
1367 > strings with escaped characters unconverted may incorrectly find that
1368 > `"a\\b"` and `"a\u005Cb"` are not equal.
1370 This implementation is interoperable as it does compare strings code unit
1375 String values are stored as pointers in a @ref basic_json type. That is,
1376 for any access to string values, a pointer of type `string_t*` must be
1379 @since version 1.0.0
1381 using string_t = StringType;
1384 @brief a type for a boolean
1386 [RFC 7159](http://rfc7159.net/rfc7159) implicitly describes a boolean as a
1387 type which differentiates the two literals `true` and `false`.
1389 To store objects in C++, a type is defined by the template parameter @a
1390 BooleanType which chooses the type to use.
1394 With the default values for @a BooleanType (`bool`), the default value for
1403 Boolean values are stored directly inside a @ref basic_json type.
1405 @since version 1.0.0
1407 using boolean_t = BooleanType;
1410 @brief a type for a number (integer)
1412 [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:
1413 > The representation of numbers is similar to that used in most
1414 > programming languages. A number is represented in base 10 using decimal
1415 > digits. It contains an integer component that may be prefixed with an
1416 > optional minus sign, which may be followed by a fraction part and/or an
1417 > exponent part. Leading zeros are not allowed. (...) Numeric values that
1418 > cannot be represented in the grammar below (such as Infinity and NaN)
1419 > are not permitted.
1421 This description includes both integer and floating-point numbers.
1422 However, C++ allows more precise storage if it is known whether the number
1423 is a signed integer, an unsigned integer or a floating-point number.
1424 Therefore, three different types, @ref number_integer_t, @ref
1425 number_unsigned_t and @ref number_float_t are used.
1427 To store integer numbers in C++, a type is defined by the template
1428 parameter @a NumberIntegerType which chooses the type to use.
1432 With the default values for @a NumberIntegerType (`int64_t`), the default
1433 value for @a number_integer_t is:
1439 #### Default behavior
1441 - The restrictions about leading zeros is not enforced in C++. Instead,
1442 leading zeros in integer literals lead to an interpretation as octal
1443 number. Internally, the value will be stored as decimal number. For
1444 instance, the C++ integer literal `010` will be serialized to `8`.
1445 During deserialization, leading zeros yield an error.
1446 - Not-a-number (NaN) values will be serialized to `null`.
1450 [RFC 7159](http://rfc7159.net/rfc7159) specifies:
1451 > An implementation may set limits on the range and precision of numbers.
1453 When the default type is used, the maximal integer number that can be
1454 stored is `9223372036854775807` (INT64_MAX) and the minimal integer number
1455 that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers
1456 that are out of range will yield over/underflow when used in a
1457 constructor. During deserialization, too large or small integer numbers
1458 will be automatically be stored as @ref number_unsigned_t or @ref
1461 [RFC 7159](http://rfc7159.net/rfc7159) further states:
1462 > Note that when such software is used, numbers that are integers and are
1463 > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense
1464 > that implementations will agree exactly on their numeric values.
1466 As this range is a subrange of the exactly supported range [INT64_MIN,
1467 INT64_MAX], this class's integer type is interoperable.
1471 Integer number values are stored directly inside a @ref basic_json type.
1473 @sa @ref number_float_t -- type for number values (floating-point)
1475 @sa @ref number_unsigned_t -- type for number values (unsigned integer)
1477 @since version 1.0.0
1479 using number_integer_t = NumberIntegerType;
1482 @brief a type for a number (unsigned)
1484 [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:
1485 > The representation of numbers is similar to that used in most
1486 > programming languages. A number is represented in base 10 using decimal
1487 > digits. It contains an integer component that may be prefixed with an
1488 > optional minus sign, which may be followed by a fraction part and/or an
1489 > exponent part. Leading zeros are not allowed. (...) Numeric values that
1490 > cannot be represented in the grammar below (such as Infinity and NaN)
1491 > are not permitted.
1493 This description includes both integer and floating-point numbers.
1494 However, C++ allows more precise storage if it is known whether the number
1495 is a signed integer, an unsigned integer or a floating-point number.
1496 Therefore, three different types, @ref number_integer_t, @ref
1497 number_unsigned_t and @ref number_float_t are used.
1499 To store unsigned integer numbers in C++, a type is defined by the
1500 template parameter @a NumberUnsignedType which chooses the type to use.
1504 With the default values for @a NumberUnsignedType (`uint64_t`), the
1505 default value for @a number_unsigned_t is:
1511 #### Default behavior
1513 - The restrictions about leading zeros is not enforced in C++. Instead,
1514 leading zeros in integer literals lead to an interpretation as octal
1515 number. Internally, the value will be stored as decimal number. For
1516 instance, the C++ integer literal `010` will be serialized to `8`.
1517 During deserialization, leading zeros yield an error.
1518 - Not-a-number (NaN) values will be serialized to `null`.
1522 [RFC 7159](http://rfc7159.net/rfc7159) specifies:
1523 > An implementation may set limits on the range and precision of numbers.
1525 When the default type is used, the maximal integer number that can be
1526 stored is `18446744073709551615` (UINT64_MAX) and the minimal integer
1527 number that can be stored is `0`. Integer numbers that are out of range
1528 will yield over/underflow when used in a constructor. During
1529 deserialization, too large or small integer numbers will be automatically
1530 be stored as @ref number_integer_t or @ref number_float_t.
1532 [RFC 7159](http://rfc7159.net/rfc7159) further states:
1533 > Note that when such software is used, numbers that are integers and are
1534 > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense
1535 > that implementations will agree exactly on their numeric values.
1537 As this range is a subrange (when considered in conjunction with the
1538 number_integer_t type) of the exactly supported range [0, UINT64_MAX],
1539 this class's integer type is interoperable.
1543 Integer number values are stored directly inside a @ref basic_json type.
1545 @sa @ref number_float_t -- type for number values (floating-point)
1546 @sa @ref number_integer_t -- type for number values (integer)
1548 @since version 2.0.0
1550 using number_unsigned_t = NumberUnsignedType;
1553 @brief a type for a number (floating-point)
1555 [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:
1556 > The representation of numbers is similar to that used in most
1557 > programming languages. A number is represented in base 10 using decimal
1558 > digits. It contains an integer component that may be prefixed with an
1559 > optional minus sign, which may be followed by a fraction part and/or an
1560 > exponent part. Leading zeros are not allowed. (...) Numeric values that
1561 > cannot be represented in the grammar below (such as Infinity and NaN)
1562 > are not permitted.
1564 This description includes both integer and floating-point numbers.
1565 However, C++ allows more precise storage if it is known whether the number
1566 is a signed integer, an unsigned integer or a floating-point number.
1567 Therefore, three different types, @ref number_integer_t, @ref
1568 number_unsigned_t and @ref number_float_t are used.
1570 To store floating-point numbers in C++, a type is defined by the template
1571 parameter @a NumberFloatType which chooses the type to use.
1575 With the default values for @a NumberFloatType (`double`), the default
1576 value for @a number_float_t is:
1582 #### Default behavior
1584 - The restrictions about leading zeros is not enforced in C++. Instead,
1585 leading zeros in floating-point literals will be ignored. Internally,
1586 the value will be stored as decimal number. For instance, the C++
1587 floating-point literal `01.2` will be serialized to `1.2`. During
1588 deserialization, leading zeros yield an error.
1589 - Not-a-number (NaN) values will be serialized to `null`.
1593 [RFC 7159](http://rfc7159.net/rfc7159) states:
1594 > This specification allows implementations to set limits on the range and
1595 > precision of numbers accepted. Since software that implements IEEE
1596 > 754-2008 binary64 (double precision) numbers is generally available and
1597 > widely used, good interoperability can be achieved by implementations
1598 > that expect no more precision or range than these provide, in the sense
1599 > that implementations will approximate JSON numbers within the expected
1602 This implementation does exactly follow this approach, as it uses double
1603 precision floating-point numbers. Note values smaller than
1604 `-1.79769313486232e+308` and values greater than `1.79769313486232e+308`
1605 will be stored as NaN internally and be serialized to `null`.
1609 Floating-point number values are stored directly inside a @ref basic_json
1612 @sa @ref number_integer_t -- type for number values (integer)
1614 @sa @ref number_unsigned_t -- type for number values (unsigned integer)
1616 @since version 1.0.0
1618 using number_float_t = NumberFloatType;
1624 /// helper for exception-safe object creation
1625 template<typename T, typename... Args>
1626 static T* create(Args&& ... args)
1628 AllocatorType<T> alloc;
1629 auto deleter = [&](T * object)
1631 alloc.deallocate(object, 1);
1633 std::unique_ptr<T, decltype(deleter)> object(alloc.allocate(1), deleter);
1634 alloc.construct(object.get(), std::forward<Args>(args)...);
1635 assert(object != nullptr);
1636 return object.release();
1639 ////////////////////////
1640 // JSON value storage //
1641 ////////////////////////
1646 The actual storage for a JSON value of the @ref basic_json class. This
1647 union combines the different storage types for the JSON value types
1648 defined in @ref value_t.
1650 JSON type | value_t type | used type
1651 --------- | --------------- | ------------------------
1652 object | object | pointer to @ref object_t
1653 array | array | pointer to @ref array_t
1654 string | string | pointer to @ref string_t
1655 boolean | boolean | @ref boolean_t
1656 number | number_integer | @ref number_integer_t
1657 number | number_unsigned | @ref number_unsigned_t
1658 number | number_float | @ref number_float_t
1659 null | null | *no value is stored*
1661 @note Variable-length types (objects, arrays, and strings) are stored as
1662 pointers. The size of the union should not exceed 64 bits if the default
1663 value types are used.
1665 @since version 1.0.0
1669 /// object (stored with pointer to save storage)
1671 /// array (stored with pointer to save storage)
1673 /// string (stored with pointer to save storage)
1677 /// number (integer)
1678 number_integer_t number_integer;
1679 /// number (unsigned integer)
1680 number_unsigned_t number_unsigned;
1681 /// number (floating-point)
1682 number_float_t number_float;
1684 /// default constructor (for null values)
1685 json_value() = default;
1686 /// constructor for booleans
1687 json_value(boolean_t v) noexcept : boolean(v) {}
1688 /// constructor for numbers (integer)
1689 json_value(number_integer_t v) noexcept : number_integer(v) {}
1690 /// constructor for numbers (unsigned)
1691 json_value(number_unsigned_t v) noexcept : number_unsigned(v) {}
1692 /// constructor for numbers (floating-point)
1693 json_value(number_float_t v) noexcept : number_float(v) {}
1694 /// constructor for empty values of a given type
1695 json_value(value_t t)
1699 case value_t::object:
1701 object = create<object_t>();
1705 case value_t::array:
1707 array = create<array_t>();
1711 case value_t::string:
1713 string = create<string_t>("");
1717 case value_t::boolean:
1719 boolean = boolean_t(false);
1723 case value_t::number_integer:
1725 number_integer = number_integer_t(0);
1729 case value_t::number_unsigned:
1731 number_unsigned = number_unsigned_t(0);
1735 case value_t::number_float:
1737 number_float = number_float_t(0.0);
1748 if (t == value_t::null)
1750 JSON_THROW(std::domain_error("961c151d2e87f2686a955a9be24d316f1362bf21 2.1.1")); // LCOV_EXCL_LINE
1757 /// constructor for strings
1758 json_value(const string_t& value)
1760 string = create<string_t>(value);
1763 /// constructor for objects
1764 json_value(const object_t& value)
1766 object = create<object_t>(value);
1769 /// constructor for arrays
1770 json_value(const array_t& value)
1772 array = create<array_t>(value);
1777 @brief checks the class invariants
1779 This function asserts the class invariants. It needs to be called at the
1780 end of every constructor to make sure that created objects respect the
1781 invariant. Furthermore, it has to be called each time the type of a JSON
1782 value is changed, because the invariant expresses a relationship between
1783 @a m_type and @a m_value.
1785 void assert_invariant() const
1787 assert(m_type != value_t::object or m_value.object != nullptr);
1788 assert(m_type != value_t::array or m_value.array != nullptr);
1789 assert(m_type != value_t::string or m_value.string != nullptr);
1793 //////////////////////////
1794 // JSON parser callback //
1795 //////////////////////////
1798 @brief JSON callback events
1800 This enumeration lists the parser events that can trigger calling a
1801 callback function of type @ref parser_callback_t during parsing.
1803 @image html callback_events.png "Example when certain parse events are triggered"
1805 @since version 1.0.0
1807 enum class parse_event_t : uint8_t
1809 /// the parser read `{` and started to process a JSON object
1811 /// the parser read `}` and finished processing a JSON object
1813 /// the parser read `[` and started to process a JSON array
1815 /// the parser read `]` and finished processing a JSON array
1817 /// the parser read a key of a value in an object
1819 /// the parser finished reading a JSON value
1824 @brief per-element parser callback type
1826 With a parser callback function, the result of parsing a JSON text can be
1827 influenced. When passed to @ref parse(std::istream&, const
1828 parser_callback_t) or @ref parse(const CharT, const parser_callback_t),
1829 it is called on certain events (passed as @ref parse_event_t via parameter
1830 @a event) with a set recursion depth @a depth and context JSON value
1831 @a parsed. The return value of the callback function is a boolean
1832 indicating whether the element that emitted the callback shall be kept or
1835 We distinguish six scenarios (determined by the event type) in which the
1836 callback function can be called. The following table describes the values
1837 of the parameters @a depth, @a event, and @a parsed.
1839 parameter @a event | description | parameter @a depth | parameter @a parsed
1840 ------------------ | ----------- | ------------------ | -------------------
1841 parse_event_t::object_start | the parser read `{` and started to process a JSON object | depth of the parent of the JSON object | a JSON value with type discarded
1842 parse_event_t::key | the parser read a key of a value in an object | depth of the currently parsed JSON object | a JSON string containing the key
1843 parse_event_t::object_end | the parser read `}` and finished processing a JSON object | depth of the parent of the JSON object | the parsed JSON object
1844 parse_event_t::array_start | the parser read `[` and started to process a JSON array | depth of the parent of the JSON array | a JSON value with type discarded
1845 parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array
1846 parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value
1848 @image html callback_events.png "Example when certain parse events are triggered"
1850 Discarding a value (i.e., returning `false`) has different effects
1851 depending on the context in which function was called:
1853 - Discarded values in structured types are skipped. That is, the parser
1854 will behave as if the discarded value was never read.
1855 - In case a value outside a structured type is skipped, it is replaced
1856 with `null`. This case happens if the top-level element is skipped.
1858 @param[in] depth the depth of the recursion during parsing
1860 @param[in] event an event of type parse_event_t indicating the context in
1861 the callback function has been called
1863 @param[in,out] parsed the current intermediate parse result; note that
1864 writing to this value has no effect for parse_event_t::key events
1866 @return Whether the JSON value which called the function during parsing
1867 should be kept (`true`) or not (`false`). In the latter case, it is either
1868 skipped completely or replaced by an empty discarded object.
1870 @sa @ref parse(std::istream&, parser_callback_t) or
1871 @ref parse(const CharT, const parser_callback_t) for examples
1873 @since version 1.0.0
1875 using parser_callback_t = std::function<bool(int depth,
1876 parse_event_t event,
1877 basic_json& parsed)>;
1884 /// @name constructors and destructors
1885 /// Constructors of class @ref basic_json, copy/move constructor, copy
1886 /// assignment, static functions creating objects, and the destructor.
1890 @brief create an empty value with a given type
1892 Create an empty JSON value with a given type. The value will be default
1893 initialized with an empty value which depends on the type:
1895 Value type | initial value
1896 ----------- | -------------
1904 @param[in] value_type the type of the value to create
1906 @complexity Constant.
1908 @throw std::bad_alloc if allocation for object, array, or string value
1911 @liveexample{The following code shows the constructor for different @ref
1912 value_t values,basic_json__value_t}
1914 @since version 1.0.0
1916 basic_json(const value_t value_type)
1917 : m_type(value_type), m_value(value_type)
1923 @brief create a null object
1925 Create a `null` JSON value. It either takes a null pointer as parameter
1926 (explicitly creating `null`) or no parameter (implicitly creating `null`).
1927 The passed null pointer itself is not read -- it is only used to choose
1928 the right constructor.
1930 @complexity Constant.
1932 @exceptionsafety No-throw guarantee: this constructor never throws
1935 @liveexample{The following code shows the constructor with and without a
1936 null pointer parameter.,basic_json__nullptr_t}
1938 @since version 1.0.0
1940 basic_json(std::nullptr_t = nullptr) noexcept
1941 : basic_json(value_t::null)
1947 @brief create a JSON value
1949 This is a "catch all" constructor for all compatible JSON types; that is,
1950 types for which a `to_json()` method exsits. The constructor forwards the
1951 parameter @a val to that method (to `json_serializer<U>::to_json` method
1952 with `U = uncvref_t<CompatibleType>`, to be exact).
1954 Template type @a CompatibleType includes, but is not limited to, the
1956 - **arrays**: @ref array_t and all kinds of compatible containers such as
1957 `std::vector`, `std::deque`, `std::list`, `std::forward_list`,
1958 `std::array`, `std::set`, `std::unordered_set`, `std::multiset`, and
1959 `unordered_multiset` with a `value_type` from which a @ref basic_json
1960 value can be constructed.
1961 - **objects**: @ref object_t and all kinds of compatible associative
1962 containers such as `std::map`, `std::unordered_map`, `std::multimap`,
1963 and `std::unordered_multimap` with a `key_type` compatible to
1964 @ref string_t and a `value_type` from which a @ref basic_json value can
1966 - **strings**: @ref string_t, string literals, and all compatible string
1967 containers can be used.
1968 - **numbers**: @ref number_integer_t, @ref number_unsigned_t,
1969 @ref number_float_t, and all convertible number types such as `int`,
1970 `size_t`, `int64_t`, `float` or `double` can be used.
1971 - **boolean**: @ref boolean_t / `bool` can be used.
1973 See the examples below.
1975 @tparam CompatibleType a type such that:
1976 - @a CompatibleType is not derived from `std::istream`,
1977 - @a CompatibleType is not @ref basic_json (to avoid hijacking copy/move
1979 - @a CompatibleType is not a @ref basic_json nested type (e.g.,
1980 @ref json_pointer, @ref iterator, etc ...)
1981 - @ref @ref json_serializer<U> has a
1982 `to_json(basic_json_t&, CompatibleType&&)` method
1984 @tparam U = `uncvref_t<CompatibleType>`
1986 @param[in] val the value to be forwarded
1988 @complexity Usually linear in the size of the passed @a val, also
1989 depending on the implementation of the called `to_json()`
1992 @throw what `json_serializer<U>::to_json()` throws
1994 @liveexample{The following code shows the constructor with several
1995 compatible types.,basic_json__CompatibleType}
1997 @since version 2.1.0
1999 template<typename CompatibleType, typename U = detail::uncvref_t<CompatibleType>,
2000 detail::enable_if_t<not std::is_base_of<std::istream, U>::value and
2001 not std::is_same<U, basic_json_t>::value and
2002 not detail::is_basic_json_nested_type<
2003 basic_json_t, U>::value and
2004 detail::has_to_json<basic_json, U>::value,
2006 basic_json(CompatibleType && val) noexcept(noexcept(JSONSerializer<U>::to_json(
2007 std::declval<basic_json_t&>(), std::forward<CompatibleType>(val))))
2009 JSONSerializer<U>::to_json(*this, std::forward<CompatibleType>(val));
2014 @brief create a container (array or object) from an initializer list
2016 Creates a JSON value of type array or object from the passed initializer
2017 list @a init. In case @a type_deduction is `true` (default), the type of
2018 the JSON value to be created is deducted from the initializer list @a init
2019 according to the following rules:
2021 1. If the list is empty, an empty JSON object value `{}` is created.
2022 2. If the list consists of pairs whose first element is a string, a JSON
2023 object value is created where the first elements of the pairs are
2024 treated as keys and the second elements are as values.
2025 3. In all other cases, an array is created.
2027 The rules aim to create the best fit between a C++ initializer list and
2028 JSON values. The rationale is as follows:
2030 1. The empty initializer list is written as `{}` which is exactly an empty
2032 2. C++ has now way of describing mapped types other than to list a list of
2033 pairs. As JSON requires that keys must be of type string, rule 2 is the
2034 weakest constraint one can pose on initializer lists to interpret them
2036 3. In all other cases, the initializer list could not be interpreted as
2037 JSON object type, so interpreting it as JSON array type is safe.
2039 With the rules described above, the following JSON values cannot be
2040 expressed by an initializer list:
2042 - the empty array (`[]`): use @ref array(std::initializer_list<basic_json>)
2043 with an empty initializer list in this case
2044 - arrays whose elements satisfy rule 2: use @ref
2045 array(std::initializer_list<basic_json>) with the same initializer list
2048 @note When used without parentheses around an empty initializer list, @ref
2049 basic_json() is called instead of this function, yielding the JSON null
2052 @param[in] init initializer list with JSON values
2054 @param[in] type_deduction internal parameter; when set to `true`, the type
2055 of the JSON value is deducted from the initializer list @a init; when set
2056 to `false`, the type provided via @a manual_type is forced. This mode is
2057 used by the functions @ref array(std::initializer_list<basic_json>) and
2058 @ref object(std::initializer_list<basic_json>).
2060 @param[in] manual_type internal parameter; when @a type_deduction is set
2061 to `false`, the created JSON value will use the provided type (only @ref
2062 value_t::array and @ref value_t::object are valid); when @a type_deduction
2063 is set to `true`, this parameter has no effect
2065 @throw std::domain_error if @a type_deduction is `false`, @a manual_type
2066 is `value_t::object`, but @a init contains an element which is not a pair
2067 whose first element is a string; example: `"cannot create object from
2070 @complexity Linear in the size of the initializer list @a init.
2072 @liveexample{The example below shows how JSON values are created from
2073 initializer lists.,basic_json__list_init_t}
2075 @sa @ref array(std::initializer_list<basic_json>) -- create a JSON array
2076 value from an initializer list
2077 @sa @ref object(std::initializer_list<basic_json>) -- create a JSON object
2078 value from an initializer list
2080 @since version 1.0.0
2082 basic_json(std::initializer_list<basic_json> init,
2083 bool type_deduction = true,
2084 value_t manual_type = value_t::array)
2086 // check if each element is an array with two elements whose first
2087 // element is a string
2088 bool is_an_object = std::all_of(init.begin(), init.end(),
2089 [](const basic_json & element)
2091 return element.is_array() and element.size() == 2 and element[0].is_string();
2094 // adjust type if type deduction is not wanted
2095 if (not type_deduction)
2097 // if array is wanted, do not create an object though possible
2098 if (manual_type == value_t::array)
2100 is_an_object = false;
2103 // if object is wanted but impossible, throw an exception
2104 if (manual_type == value_t::object and not is_an_object)
2106 JSON_THROW(std::domain_error("cannot create object from initializer list"));
2112 // the initializer list is a list of pairs -> create object
2113 m_type = value_t::object;
2114 m_value = value_t::object;
2116 std::for_each(init.begin(), init.end(), [this](const basic_json & element)
2118 m_value.object->emplace(*(element[0].m_value.string), element[1]);
2123 // the initializer list describes an array -> create array
2124 m_type = value_t::array;
2125 m_value.array = create<array_t>(init);
2132 @brief explicitly create an array from an initializer list
2134 Creates a JSON array value from a given initializer list. That is, given a
2135 list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the
2136 initializer list is empty, the empty array `[]` is created.
2138 @note This function is only needed to express two edge cases that cannot
2139 be realized with the initializer list constructor (@ref
2140 basic_json(std::initializer_list<basic_json>, bool, value_t)). These cases
2142 1. creating an array whose elements are all pairs whose first element is a
2143 string -- in this case, the initializer list constructor would create an
2144 object, taking the first elements as keys
2145 2. creating an empty array -- passing the empty initializer list to the
2146 initializer list constructor yields an empty object
2148 @param[in] init initializer list with JSON values to create an array from
2151 @return JSON array value
2153 @complexity Linear in the size of @a init.
2155 @liveexample{The following code shows an example for the `array`
2158 @sa @ref basic_json(std::initializer_list<basic_json>, bool, value_t) --
2159 create a JSON value from an initializer list
2160 @sa @ref object(std::initializer_list<basic_json>) -- create a JSON object
2161 value from an initializer list
2163 @since version 1.0.0
2165 static basic_json array(std::initializer_list<basic_json> init =
2166 std::initializer_list<basic_json>())
2168 return basic_json(init, false, value_t::array);
2172 @brief explicitly create an object from an initializer list
2174 Creates a JSON object value from a given initializer list. The initializer
2175 lists elements must be pairs, and their first elements must be strings. If
2176 the initializer list is empty, the empty object `{}` is created.
2178 @note This function is only added for symmetry reasons. In contrast to the
2179 related function @ref array(std::initializer_list<basic_json>), there are
2180 no cases which can only be expressed by this function. That is, any
2181 initializer list @a init can also be passed to the initializer list
2182 constructor @ref basic_json(std::initializer_list<basic_json>, bool,
2185 @param[in] init initializer list to create an object from (optional)
2187 @return JSON object value
2189 @throw std::domain_error if @a init is not a pair whose first elements are
2191 @ref basic_json(std::initializer_list<basic_json>, bool, value_t)
2193 @complexity Linear in the size of @a init.
2195 @liveexample{The following code shows an example for the `object`
2198 @sa @ref basic_json(std::initializer_list<basic_json>, bool, value_t) --
2199 create a JSON value from an initializer list
2200 @sa @ref array(std::initializer_list<basic_json>) -- create a JSON array
2201 value from an initializer list
2203 @since version 1.0.0
2205 static basic_json object(std::initializer_list<basic_json> init =
2206 std::initializer_list<basic_json>())
2208 return basic_json(init, false, value_t::object);
2212 @brief construct an array with count copies of given value
2214 Constructs a JSON array value by creating @a cnt copies of a passed value.
2215 In case @a cnt is `0`, an empty array is created. As postcondition,
2216 `std::distance(begin(),end()) == cnt` holds.
2218 @param[in] cnt the number of JSON copies of @a val to create
2219 @param[in] val the JSON value to copy
2221 @complexity Linear in @a cnt.
2223 @liveexample{The following code shows examples for the @ref
2224 basic_json(size_type\, const basic_json&)
2225 constructor.,basic_json__size_type_basic_json}
2227 @since version 1.0.0
2229 basic_json(size_type cnt, const basic_json& val)
2230 : m_type(value_t::array)
2232 m_value.array = create<array_t>(cnt, val);
2237 @brief construct a JSON container given an iterator range
2239 Constructs the JSON value with the contents of the range `[first, last)`.
2240 The semantics depends on the different types a JSON value can have:
2241 - In case of primitive types (number, boolean, or string), @a first must
2242 be `begin()` and @a last must be `end()`. In this case, the value is
2243 copied. Otherwise, std::out_of_range is thrown.
2244 - In case of structured types (array, object), the constructor behaves as
2245 similar versions for `std::vector`.
2246 - In case of a null type, std::domain_error is thrown.
2248 @tparam InputIT an input iterator type (@ref iterator or @ref
2251 @param[in] first begin of the range to copy from (included)
2252 @param[in] last end of the range to copy from (excluded)
2254 @pre Iterators @a first and @a last must be initialized. **This
2255 precondition is enforced with an assertion.**
2257 @throw std::domain_error if iterators are not compatible; that is, do not
2258 belong to the same JSON value; example: `"iterators are not compatible"`
2259 @throw std::out_of_range if iterators are for a primitive type (number,
2260 boolean, or string) where an out of range error can be detected easily;
2261 example: `"iterators out of range"`
2262 @throw std::bad_alloc if allocation for object, array, or string fails
2263 @throw std::domain_error if called with a null value; example: `"cannot
2264 use construct with iterators from null"`
2266 @complexity Linear in distance between @a first and @a last.
2268 @liveexample{The example below shows several ways to create JSON values by
2269 specifying a subrange with iterators.,basic_json__InputIt_InputIt}
2271 @since version 1.0.0
2273 template<class InputIT, typename std::enable_if<
2274 std::is_same<InputIT, typename basic_json_t::iterator>::value or
2275 std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int>::type = 0>
2276 basic_json(InputIT first, InputIT last)
2278 assert(first.m_object != nullptr);
2279 assert(last.m_object != nullptr);
2281 // make sure iterator fits the current value
2282 if (first.m_object != last.m_object)
2284 JSON_THROW(std::domain_error("iterators are not compatible"));
2287 // copy type from first iterator
2288 m_type = first.m_object->m_type;
2290 // check if iterator range is complete for primitive values
2293 case value_t::boolean:
2294 case value_t::number_float:
2295 case value_t::number_integer:
2296 case value_t::number_unsigned:
2297 case value_t::string:
2299 if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
2301 JSON_THROW(std::out_of_range("iterators out of range"));
2314 case value_t::number_integer:
2316 m_value.number_integer = first.m_object->m_value.number_integer;
2320 case value_t::number_unsigned:
2322 m_value.number_unsigned = first.m_object->m_value.number_unsigned;
2326 case value_t::number_float:
2328 m_value.number_float = first.m_object->m_value.number_float;
2332 case value_t::boolean:
2334 m_value.boolean = first.m_object->m_value.boolean;
2338 case value_t::string:
2340 m_value = *first.m_object->m_value.string;
2344 case value_t::object:
2346 m_value.object = create<object_t>(first.m_it.object_iterator,
2347 last.m_it.object_iterator);
2351 case value_t::array:
2353 m_value.array = create<array_t>(first.m_it.array_iterator,
2354 last.m_it.array_iterator);
2360 JSON_THROW(std::domain_error("cannot use construct with iterators from " + first.m_object->type_name()));
2368 @brief construct a JSON value given an input stream
2370 @param[in,out] i stream to read a serialized JSON value from
2371 @param[in] cb a parser callback function of type @ref parser_callback_t
2372 which is used to control the deserialization by filtering unwanted values
2375 @complexity Linear in the length of the input. The parser is a predictive
2376 LL(1) parser. The complexity can be higher if the parser callback function
2377 @a cb has a super-linear complexity.
2379 @note A UTF-8 byte order mark is silently ignored.
2381 @deprecated This constructor is deprecated and will be removed in version
2382 3.0.0 to unify the interface of the library. Deserialization will be
2383 done by stream operators or by calling one of the `parse` functions,
2384 e.g. @ref parse(std::istream&, const parser_callback_t). That is, calls
2385 like `json j(i);` for an input stream @a i need to be replaced by
2386 `json j = json::parse(i);`. See the example below.
2388 @liveexample{The example below demonstrates constructing a JSON value from
2389 a `std::stringstream` with and without callback
2390 function.,basic_json__istream}
2392 @since version 2.0.0, deprecated in version 2.0.3, to be removed in
2396 explicit basic_json(std::istream& i, const parser_callback_t cb = nullptr)
2398 *this = parser(i, cb).parse();
2402 ///////////////////////////////////////
2403 // other constructors and destructor //
2404 ///////////////////////////////////////
2407 @brief copy constructor
2409 Creates a copy of a given JSON value.
2411 @param[in] other the JSON value to copy
2413 @complexity Linear in the size of @a other.
2415 @requirement This function helps `basic_json` satisfying the
2416 [Container](http://en.cppreference.com/w/cpp/concept/Container)
2418 - The complexity is linear.
2419 - As postcondition, it holds: `other == basic_json(other)`.
2421 @throw std::bad_alloc if allocation for object, array, or string fails.
2423 @liveexample{The following code shows an example for the copy
2424 constructor.,basic_json__basic_json}
2426 @since version 1.0.0
2428 basic_json(const basic_json& other)
2429 : m_type(other.m_type)
2431 // check of passed value is valid
2432 other.assert_invariant();
2436 case value_t::object:
2438 m_value = *other.m_value.object;
2442 case value_t::array:
2444 m_value = *other.m_value.array;
2448 case value_t::string:
2450 m_value = *other.m_value.string;
2454 case value_t::boolean:
2456 m_value = other.m_value.boolean;
2460 case value_t::number_integer:
2462 m_value = other.m_value.number_integer;
2466 case value_t::number_unsigned:
2468 m_value = other.m_value.number_unsigned;
2472 case value_t::number_float:
2474 m_value = other.m_value.number_float;
2488 @brief move constructor
2490 Move constructor. Constructs a JSON value with the contents of the given
2491 value @a other using move semantics. It "steals" the resources from @a
2492 other and leaves it as JSON null value.
2494 @param[in,out] other value to move to this object
2496 @post @a other is a JSON null value
2498 @complexity Constant.
2500 @liveexample{The code below shows the move constructor explicitly called
2501 via std::move.,basic_json__moveconstructor}
2503 @since version 1.0.0
2505 basic_json(basic_json&& other) noexcept
2506 : m_type(std::move(other.m_type)),
2507 m_value(std::move(other.m_value))
2509 // check that passed value is valid
2510 other.assert_invariant();
2512 // invalidate payload
2513 other.m_type = value_t::null;
2520 @brief copy assignment
2522 Copy assignment operator. Copies a JSON value via the "copy and swap"
2523 strategy: It is expressed in terms of the copy constructor, destructor,
2524 and the swap() member function.
2526 @param[in] other value to copy from
2530 @requirement This function helps `basic_json` satisfying the
2531 [Container](http://en.cppreference.com/w/cpp/concept/Container)
2533 - The complexity is linear.
2535 @liveexample{The code below shows and example for the copy assignment. It
2536 creates a copy of value `a` which is then swapped with `b`. Finally\, the
2537 copy of `a` (which is the null value after the swap) is
2538 destroyed.,basic_json__copyassignment}
2540 @since version 1.0.0
2542 reference& operator=(basic_json other) noexcept (
2543 std::is_nothrow_move_constructible<value_t>::value and
2544 std::is_nothrow_move_assignable<value_t>::value and
2545 std::is_nothrow_move_constructible<json_value>::value and
2546 std::is_nothrow_move_assignable<json_value>::value
2549 // check that passed value is valid
2550 other.assert_invariant();
2553 swap(m_type, other.m_type);
2554 swap(m_value, other.m_value);
2563 Destroys the JSON value and frees all allocated memory.
2567 @requirement This function helps `basic_json` satisfying the
2568 [Container](http://en.cppreference.com/w/cpp/concept/Container)
2570 - The complexity is linear.
2571 - All stored elements are destroyed and all memory is freed.
2573 @since version 1.0.0
2581 case value_t::object:
2583 AllocatorType<object_t> alloc;
2584 alloc.destroy(m_value.object);
2585 alloc.deallocate(m_value.object, 1);
2589 case value_t::array:
2591 AllocatorType<array_t> alloc;
2592 alloc.destroy(m_value.array);
2593 alloc.deallocate(m_value.array, 1);
2597 case value_t::string:
2599 AllocatorType<string_t> alloc;
2600 alloc.destroy(m_value.string);
2601 alloc.deallocate(m_value.string, 1);
2607 // all other types need no specific destructor
2616 ///////////////////////
2617 // object inspection //
2618 ///////////////////////
2620 /// @name object inspection
2621 /// Functions to inspect the type of a JSON value.
2625 @brief serialization
2627 Serialization function for JSON values. The function tries to mimic
2628 Python's `json.dumps()` function, and currently supports its @a indent
2631 @param[in] indent If indent is nonnegative, then array elements and object
2632 members will be pretty-printed with that indent level. An indent level of
2633 `0` will only insert newlines. `-1` (the default) selects the most compact
2636 @return string containing the serialization of the JSON value
2640 @liveexample{The following example shows the effect of different @a indent
2641 parameters to the result of the serialization.,dump}
2643 @see https://docs.python.org/2/library/json.html#json.dump
2645 @since version 1.0.0
2647 string_t dump(const int indent = -1) const
2649 std::stringstream ss;
2653 dump(ss, true, static_cast<unsigned int>(indent));
2664 @brief return the type of the JSON value (explicit)
2666 Return the type of the JSON value as a value from the @ref value_t
2669 @return the type of the JSON value
2671 @complexity Constant.
2673 @exceptionsafety No-throw guarantee: this member function never throws
2676 @liveexample{The following code exemplifies `type()` for all JSON
2679 @since version 1.0.0
2681 constexpr value_t type() const noexcept
2687 @brief return whether type is primitive
2689 This function returns true iff the JSON type is primitive (string, number,
2692 @return `true` if type is primitive (string, number, boolean, or null),
2695 @complexity Constant.
2697 @exceptionsafety No-throw guarantee: this member function never throws
2700 @liveexample{The following code exemplifies `is_primitive()` for all JSON
2701 types.,is_primitive}
2703 @sa @ref is_structured() -- returns whether JSON value is structured
2704 @sa @ref is_null() -- returns whether JSON value is `null`
2705 @sa @ref is_string() -- returns whether JSON value is a string
2706 @sa @ref is_boolean() -- returns whether JSON value is a boolean
2707 @sa @ref is_number() -- returns whether JSON value is a number
2709 @since version 1.0.0
2711 constexpr bool is_primitive() const noexcept
2713 return is_null() or is_string() or is_boolean() or is_number();
2717 @brief return whether type is structured
2719 This function returns true iff the JSON type is structured (array or
2722 @return `true` if type is structured (array or object), `false` otherwise.
2724 @complexity Constant.
2726 @exceptionsafety No-throw guarantee: this member function never throws
2729 @liveexample{The following code exemplifies `is_structured()` for all JSON
2730 types.,is_structured}
2732 @sa @ref is_primitive() -- returns whether value is primitive
2733 @sa @ref is_array() -- returns whether value is an array
2734 @sa @ref is_object() -- returns whether value is an object
2736 @since version 1.0.0
2738 constexpr bool is_structured() const noexcept
2740 return is_array() or is_object();
2744 @brief return whether value is null
2746 This function returns true iff the JSON value is null.
2748 @return `true` if type is null, `false` otherwise.
2750 @complexity Constant.
2752 @exceptionsafety No-throw guarantee: this member function never throws
2755 @liveexample{The following code exemplifies `is_null()` for all JSON
2758 @since version 1.0.0
2760 constexpr bool is_null() const noexcept
2762 return m_type == value_t::null;
2766 @brief return whether value is a boolean
2768 This function returns true iff the JSON value is a boolean.
2770 @return `true` if type is boolean, `false` otherwise.
2772 @complexity Constant.
2774 @exceptionsafety No-throw guarantee: this member function never throws
2777 @liveexample{The following code exemplifies `is_boolean()` for all JSON
2780 @since version 1.0.0
2782 constexpr bool is_boolean() const noexcept
2784 return m_type == value_t::boolean;
2788 @brief return whether value is a number
2790 This function returns true iff the JSON value is a number. This includes
2791 both integer and floating-point values.
2793 @return `true` if type is number (regardless whether integer, unsigned
2794 integer or floating-type), `false` otherwise.
2796 @complexity Constant.
2798 @exceptionsafety No-throw guarantee: this member function never throws
2801 @liveexample{The following code exemplifies `is_number()` for all JSON
2804 @sa @ref is_number_integer() -- check if value is an integer or unsigned
2806 @sa @ref is_number_unsigned() -- check if value is an unsigned integer
2808 @sa @ref is_number_float() -- check if value is a floating-point number
2810 @since version 1.0.0
2812 constexpr bool is_number() const noexcept
2814 return is_number_integer() or is_number_float();
2818 @brief return whether value is an integer number
2820 This function returns true iff the JSON value is an integer or unsigned
2821 integer number. This excludes floating-point values.
2823 @return `true` if type is an integer or unsigned integer number, `false`
2826 @complexity Constant.
2828 @exceptionsafety No-throw guarantee: this member function never throws
2831 @liveexample{The following code exemplifies `is_number_integer()` for all
2832 JSON types.,is_number_integer}
2834 @sa @ref is_number() -- check if value is a number
2835 @sa @ref is_number_unsigned() -- check if value is an unsigned integer
2837 @sa @ref is_number_float() -- check if value is a floating-point number
2839 @since version 1.0.0
2841 constexpr bool is_number_integer() const noexcept
2843 return m_type == value_t::number_integer or m_type == value_t::number_unsigned;
2847 @brief return whether value is an unsigned integer number
2849 This function returns true iff the JSON value is an unsigned integer
2850 number. This excludes floating-point and (signed) integer values.
2852 @return `true` if type is an unsigned integer number, `false` otherwise.
2854 @complexity Constant.
2856 @exceptionsafety No-throw guarantee: this member function never throws
2859 @liveexample{The following code exemplifies `is_number_unsigned()` for all
2860 JSON types.,is_number_unsigned}
2862 @sa @ref is_number() -- check if value is a number
2863 @sa @ref is_number_integer() -- check if value is an integer or unsigned
2865 @sa @ref is_number_float() -- check if value is a floating-point number
2867 @since version 2.0.0
2869 constexpr bool is_number_unsigned() const noexcept
2871 return m_type == value_t::number_unsigned;
2875 @brief return whether value is a floating-point number
2877 This function returns true iff the JSON value is a floating-point number.
2878 This excludes integer and unsigned integer values.
2880 @return `true` if type is a floating-point number, `false` otherwise.
2882 @complexity Constant.
2884 @exceptionsafety No-throw guarantee: this member function never throws
2887 @liveexample{The following code exemplifies `is_number_float()` for all
2888 JSON types.,is_number_float}
2890 @sa @ref is_number() -- check if value is number
2891 @sa @ref is_number_integer() -- check if value is an integer number
2892 @sa @ref is_number_unsigned() -- check if value is an unsigned integer
2895 @since version 1.0.0
2897 constexpr bool is_number_float() const noexcept
2899 return m_type == value_t::number_float;
2903 @brief return whether value is an object
2905 This function returns true iff the JSON value is an object.
2907 @return `true` if type is object, `false` otherwise.
2909 @complexity Constant.
2911 @exceptionsafety No-throw guarantee: this member function never throws
2914 @liveexample{The following code exemplifies `is_object()` for all JSON
2917 @since version 1.0.0
2919 constexpr bool is_object() const noexcept
2921 return m_type == value_t::object;
2925 @brief return whether value is an array
2927 This function returns true iff the JSON value is an array.
2929 @return `true` if type is array, `false` otherwise.
2931 @complexity Constant.
2933 @exceptionsafety No-throw guarantee: this member function never throws
2936 @liveexample{The following code exemplifies `is_array()` for all JSON
2939 @since version 1.0.0
2941 constexpr bool is_array() const noexcept
2943 return m_type == value_t::array;
2947 @brief return whether value is a string
2949 This function returns true iff the JSON value is a string.
2951 @return `true` if type is string, `false` otherwise.
2953 @complexity Constant.
2955 @exceptionsafety No-throw guarantee: this member function never throws
2958 @liveexample{The following code exemplifies `is_string()` for all JSON
2961 @since version 1.0.0
2963 constexpr bool is_string() const noexcept
2965 return m_type == value_t::string;
2969 @brief return whether value is discarded
2971 This function returns true iff the JSON value was discarded during parsing
2972 with a callback function (see @ref parser_callback_t).
2974 @note This function will always be `false` for JSON values after parsing.
2975 That is, discarded values can only occur during parsing, but will be
2976 removed when inside a structured value or replaced by null in other cases.
2978 @return `true` if type is discarded, `false` otherwise.
2980 @complexity Constant.
2982 @exceptionsafety No-throw guarantee: this member function never throws
2985 @liveexample{The following code exemplifies `is_discarded()` for all JSON
2986 types.,is_discarded}
2988 @since version 1.0.0
2990 constexpr bool is_discarded() const noexcept
2992 return m_type == value_t::discarded;
2996 @brief return the type of the JSON value (implicit)
2998 Implicitly return the type of the JSON value as a value from the @ref
2999 value_t enumeration.
3001 @return the type of the JSON value
3003 @complexity Constant.
3005 @exceptionsafety No-throw guarantee: this member function never throws
3008 @liveexample{The following code exemplifies the @ref value_t operator for
3009 all JSON types.,operator__value_t}
3011 @since version 1.0.0
3013 constexpr operator value_t() const noexcept
3025 /// get a boolean (explicit)
3026 boolean_t get_impl(boolean_t* /*unused*/) const
3030 return m_value.boolean;
3033 JSON_THROW(std::domain_error("type must be boolean, but is " + type_name()));
3036 /// get a pointer to the value (object)
3037 object_t* get_impl_ptr(object_t* /*unused*/) noexcept
3039 return is_object() ? m_value.object : nullptr;
3042 /// get a pointer to the value (object)
3043 constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept
3045 return is_object() ? m_value.object : nullptr;
3048 /// get a pointer to the value (array)
3049 array_t* get_impl_ptr(array_t* /*unused*/) noexcept
3051 return is_array() ? m_value.array : nullptr;
3054 /// get a pointer to the value (array)
3055 constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept
3057 return is_array() ? m_value.array : nullptr;
3060 /// get a pointer to the value (string)
3061 string_t* get_impl_ptr(string_t* /*unused*/) noexcept
3063 return is_string() ? m_value.string : nullptr;
3066 /// get a pointer to the value (string)
3067 constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept
3069 return is_string() ? m_value.string : nullptr;
3072 /// get a pointer to the value (boolean)
3073 boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept
3075 return is_boolean() ? &m_value.boolean : nullptr;
3078 /// get a pointer to the value (boolean)
3079 constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept
3081 return is_boolean() ? &m_value.boolean : nullptr;
3084 /// get a pointer to the value (integer number)
3085 number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept
3087 return is_number_integer() ? &m_value.number_integer : nullptr;
3090 /// get a pointer to the value (integer number)
3091 constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept
3093 return is_number_integer() ? &m_value.number_integer : nullptr;
3096 /// get a pointer to the value (unsigned number)
3097 number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept
3099 return is_number_unsigned() ? &m_value.number_unsigned : nullptr;
3102 /// get a pointer to the value (unsigned number)
3103 constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept
3105 return is_number_unsigned() ? &m_value.number_unsigned : nullptr;
3108 /// get a pointer to the value (floating-point number)
3109 number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept
3111 return is_number_float() ? &m_value.number_float : nullptr;
3114 /// get a pointer to the value (floating-point number)
3115 constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept
3117 return is_number_float() ? &m_value.number_float : nullptr;
3121 @brief helper function to implement get_ref()
3123 This funcion helps to implement get_ref() without code duplication for
3124 const and non-const overloads
3126 @tparam ThisType will be deduced as `basic_json` or `const basic_json`
3128 @throw std::domain_error if ReferenceType does not match underlying value
3129 type of the current JSON
3131 template<typename ReferenceType, typename ThisType>
3132 static ReferenceType get_ref_impl(ThisType& obj)
3135 using PointerType = typename std::add_pointer<ReferenceType>::type;
3137 // delegate the call to get_ptr<>()
3138 auto ptr = obj.template get_ptr<PointerType>();
3145 JSON_THROW(std::domain_error("incompatible ReferenceType for get_ref, actual type is " +
3150 /// @name value access
3151 /// Direct access to the stored value of a JSON value.
3155 @brief get special-case overload
3157 This overloads avoids a lot of template boilerplate, it can be seen as the
3160 @tparam BasicJsonType == @ref basic_json
3162 @return a copy of *this
3164 @complexity Constant.
3166 @since version 2.1.0
3169 typename BasicJsonType,
3170 detail::enable_if_t<std::is_same<typename std::remove_const<BasicJsonType>::type,
3171 basic_json_t>::value,
3173 basic_json get() const
3179 @brief get a value (explicit)
3181 Explicit type conversion between the JSON value and a compatible value
3182 which is [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible)
3183 and [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible).
3184 The value is converted by calling the @ref json_serializer<ValueType>
3185 `from_json()` method.
3187 The function is equivalent to executing
3190 JSONSerializer<ValueType>::from_json(*this, ret);
3194 This overloads is chosen if:
3195 - @a ValueType is not @ref basic_json,
3196 - @ref json_serializer<ValueType> has a `from_json()` method of the form
3197 `void from_json(const @ref basic_json&, ValueType&)`, and
3198 - @ref json_serializer<ValueType> does not have a `from_json()` method of
3199 the form `ValueType from_json(const @ref basic_json&)`
3201 @tparam ValueTypeCV the provided value type
3202 @tparam ValueType the returned value type
3204 @return copy of the JSON value, converted to @a ValueType
3206 @throw what @ref json_serializer<ValueType> `from_json()` method throws
3208 @liveexample{The example below shows several conversions from JSON values
3209 to other types. There a few things to note: (1) Floating-point numbers can
3210 be converted to integers\, (2) A JSON array can be converted to a standard
3211 `std::vector<short>`\, (3) A JSON object can be converted to C++
3212 associative containers such as `std::unordered_map<std::string\,
3213 json>`.,get__ValueType_const}
3215 @since version 2.1.0
3218 typename ValueTypeCV,
3219 typename ValueType = detail::uncvref_t<ValueTypeCV>,
3220 detail::enable_if_t <
3221 not std::is_same<basic_json_t, ValueType>::value and
3222 detail::has_from_json<basic_json_t, ValueType>::value and
3223 not detail::has_non_default_from_json<basic_json_t, ValueType>::value,
3225 ValueType get() const noexcept(noexcept(
3226 JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>())))
3228 // we cannot static_assert on ValueTypeCV being non-const, because
3229 // there is support for get<const basic_json_t>(), which is why we
3230 // still need the uncvref
3231 static_assert(not std::is_reference<ValueTypeCV>::value,
3232 "get() cannot be used with reference types, you might want to use get_ref()");
3233 static_assert(std::is_default_constructible<ValueType>::value,
3234 "types must be DefaultConstructible when used with get()");
3237 JSONSerializer<ValueType>::from_json(*this, ret);
3242 @brief get a value (explicit); special case
3244 Explicit type conversion between the JSON value and a compatible value
3245 which is **not** [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible)
3246 and **not** [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible).
3247 The value is converted by calling the @ref json_serializer<ValueType>
3248 `from_json()` method.
3250 The function is equivalent to executing
3252 return JSONSerializer<ValueTypeCV>::from_json(*this);
3255 This overloads is chosen if:
3256 - @a ValueType is not @ref basic_json and
3257 - @ref json_serializer<ValueType> has a `from_json()` method of the form
3258 `ValueType from_json(const @ref basic_json&)`
3260 @note If @ref json_serializer<ValueType> has both overloads of
3261 `from_json()`, this one is chosen.
3263 @tparam ValueTypeCV the provided value type
3264 @tparam ValueType the returned value type
3266 @return copy of the JSON value, converted to @a ValueType
3268 @throw what @ref json_serializer<ValueType> `from_json()` method throws
3270 @since version 2.1.0
3273 typename ValueTypeCV,
3274 typename ValueType = detail::uncvref_t<ValueTypeCV>,
3275 detail::enable_if_t<not std::is_same<basic_json_t, ValueType>::value and
3276 detail::has_non_default_from_json<basic_json_t,
3277 ValueType>::value, int> = 0 >
3278 ValueType get() const noexcept(noexcept(
3279 JSONSerializer<ValueTypeCV>::from_json(std::declval<const basic_json_t&>())))
3281 static_assert(not std::is_reference<ValueTypeCV>::value,
3282 "get() cannot be used with reference types, you might want to use get_ref()");
3283 return JSONSerializer<ValueTypeCV>::from_json(*this);
3287 @brief get a pointer value (explicit)
3289 Explicit pointer access to the internally stored JSON value. No copies are
3292 @warning The pointer becomes invalid if the underlying JSON object
3295 @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref
3296 object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,
3297 @ref number_unsigned_t, or @ref number_float_t.
3299 @return pointer to the internally stored JSON value if the requested
3300 pointer type @a PointerType fits to the JSON value; `nullptr` otherwise
3302 @complexity Constant.
3304 @liveexample{The example below shows how pointers to internal values of a
3305 JSON value can be requested. Note that no type conversions are made and a
3306 `nullptr` is returned if the value and the requested pointer type does not
3307 match.,get__PointerType}
3309 @sa @ref get_ptr() for explicit pointer-member access
3311 @since version 1.0.0
3313 template<typename PointerType, typename std::enable_if<
3314 std::is_pointer<PointerType>::value, int>::type = 0>
3315 PointerType get() noexcept
3317 // delegate the call to get_ptr
3318 return get_ptr<PointerType>();
3322 @brief get a pointer value (explicit)
3325 template<typename PointerType, typename std::enable_if<
3326 std::is_pointer<PointerType>::value, int>::type = 0>
3327 constexpr const PointerType get() const noexcept
3329 // delegate the call to get_ptr
3330 return get_ptr<PointerType>();
3334 @brief get a pointer value (implicit)
3336 Implicit pointer access to the internally stored JSON value. No copies are
3339 @warning Writing data to the pointee of the result yields an undefined
3342 @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref
3343 object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,
3344 @ref number_unsigned_t, or @ref number_float_t. Enforced by a static
3347 @return pointer to the internally stored JSON value if the requested
3348 pointer type @a PointerType fits to the JSON value; `nullptr` otherwise
3350 @complexity Constant.
3352 @liveexample{The example below shows how pointers to internal values of a
3353 JSON value can be requested. Note that no type conversions are made and a
3354 `nullptr` is returned if the value and the requested pointer type does not
3357 @since version 1.0.0
3359 template<typename PointerType, typename std::enable_if<
3360 std::is_pointer<PointerType>::value, int>::type = 0>
3361 PointerType get_ptr() noexcept
3363 // get the type of the PointerType (remove pointer and const)
3364 using pointee_t = typename std::remove_const<typename
3365 std::remove_pointer<typename
3366 std::remove_const<PointerType>::type>::type>::type;
3367 // make sure the type matches the allowed types
3369 std::is_same<object_t, pointee_t>::value
3370 or std::is_same<array_t, pointee_t>::value
3371 or std::is_same<string_t, pointee_t>::value
3372 or std::is_same<boolean_t, pointee_t>::value
3373 or std::is_same<number_integer_t, pointee_t>::value
3374 or std::is_same<number_unsigned_t, pointee_t>::value
3375 or std::is_same<number_float_t, pointee_t>::value
3376 , "incompatible pointer type");
3378 // delegate the call to get_impl_ptr<>()
3379 return get_impl_ptr(static_cast<PointerType>(nullptr));
3383 @brief get a pointer value (implicit)
3386 template<typename PointerType, typename std::enable_if<
3387 std::is_pointer<PointerType>::value and
3388 std::is_const<typename std::remove_pointer<PointerType>::type>::value, int>::type = 0>
3389 constexpr const PointerType get_ptr() const noexcept
3391 // get the type of the PointerType (remove pointer and const)
3392 using pointee_t = typename std::remove_const<typename
3393 std::remove_pointer<typename
3394 std::remove_const<PointerType>::type>::type>::type;
3395 // make sure the type matches the allowed types
3397 std::is_same<object_t, pointee_t>::value
3398 or std::is_same<array_t, pointee_t>::value
3399 or std::is_same<string_t, pointee_t>::value
3400 or std::is_same<boolean_t, pointee_t>::value
3401 or std::is_same<number_integer_t, pointee_t>::value
3402 or std::is_same<number_unsigned_t, pointee_t>::value
3403 or std::is_same<number_float_t, pointee_t>::value
3404 , "incompatible pointer type");
3406 // delegate the call to get_impl_ptr<>() const
3407 return get_impl_ptr(static_cast<const PointerType>(nullptr));
3411 @brief get a reference value (implicit)
3413 Implicit reference access to the internally stored JSON value. No copies
3416 @warning Writing data to the referee of the result yields an undefined
3419 @tparam ReferenceType reference type; must be a reference to @ref array_t,
3420 @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or
3421 @ref number_float_t. Enforced by static assertion.
3423 @return reference to the internally stored JSON value if the requested
3424 reference type @a ReferenceType fits to the JSON value; throws
3425 std::domain_error otherwise
3427 @throw std::domain_error in case passed type @a ReferenceType is
3428 incompatible with the stored JSON value
3430 @complexity Constant.
3432 @liveexample{The example shows several calls to `get_ref()`.,get_ref}
3434 @since version 1.1.0
3436 template<typename ReferenceType, typename std::enable_if<
3437 std::is_reference<ReferenceType>::value, int>::type = 0>
3438 ReferenceType get_ref()
3440 // delegate call to get_ref_impl
3441 return get_ref_impl<ReferenceType>(*this);
3445 @brief get a reference value (implicit)
3448 template<typename ReferenceType, typename std::enable_if<
3449 std::is_reference<ReferenceType>::value and
3450 std::is_const<typename std::remove_reference<ReferenceType>::type>::value, int>::type = 0>
3451 ReferenceType get_ref() const
3453 // delegate call to get_ref_impl
3454 return get_ref_impl<ReferenceType>(*this);
3458 @brief get a value (implicit)
3460 Implicit type conversion between the JSON value and a compatible value.
3461 The call is realized by calling @ref get() const.
3463 @tparam ValueType non-pointer type compatible to the JSON value, for
3464 instance `int` for JSON integer numbers, `bool` for JSON booleans, or
3465 `std::vector` types for JSON arrays. The character type of @ref string_t
3466 as well as an initializer list of this type is excluded to avoid
3467 ambiguities as these types implicitly convert to `std::string`.
3469 @return copy of the JSON value, converted to type @a ValueType
3471 @throw std::domain_error in case passed type @a ValueType is incompatible
3472 to JSON, thrown by @ref get() const
3474 @complexity Linear in the size of the JSON value.
3476 @liveexample{The example below shows several conversions from JSON values
3477 to other types. There a few things to note: (1) Floating-point numbers can
3478 be converted to integers\, (2) A JSON array can be converted to a standard
3479 `std::vector<short>`\, (3) A JSON object can be converted to C++
3480 associative containers such as `std::unordered_map<std::string\,
3481 json>`.,operator__ValueType}
3483 @since version 1.0.0
3485 template < typename ValueType, typename std::enable_if <
3486 not std::is_pointer<ValueType>::value and
3487 not std::is_same<ValueType, typename string_t::value_type>::value
3488 #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015
3489 and not std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value
3492 operator ValueType() const
3494 // delegate the call to get<>() const
3495 return get<ValueType>();
3501 ////////////////////
3502 // element access //
3503 ////////////////////
3505 /// @name element access
3506 /// Access to the JSON value.
3510 @brief access specified array element with bounds checking
3512 Returns a reference to the element at specified location @a idx, with
3515 @param[in] idx index of the element to access
3517 @return reference to the element at index @a idx
3519 @throw std::domain_error if the JSON value is not an array; example:
3520 `"cannot use at() with string"`
3521 @throw std::out_of_range if the index @a idx is out of range of the array;
3522 that is, `idx >= size()`; example: `"array index 7 is out of range"`
3524 @complexity Constant.
3526 @liveexample{The example below shows how array elements can be read and
3527 written using `at()`.,at__size_type}
3529 @since version 1.0.0
3531 reference at(size_type idx)
3533 // at only works for arrays
3538 return m_value.array->at(idx);
3540 JSON_CATCH (std::out_of_range&)
3542 // create better exception explanation
3543 JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range"));
3548 JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
3553 @brief access specified array element with bounds checking
3555 Returns a const reference to the element at specified location @a idx,
3556 with bounds checking.
3558 @param[in] idx index of the element to access
3560 @return const reference to the element at index @a idx
3562 @throw std::domain_error if the JSON value is not an array; example:
3563 `"cannot use at() with string"`
3564 @throw std::out_of_range if the index @a idx is out of range of the array;
3565 that is, `idx >= size()`; example: `"array index 7 is out of range"`
3567 @complexity Constant.
3569 @liveexample{The example below shows how array elements can be read using
3570 `at()`.,at__size_type_const}
3572 @since version 1.0.0
3574 const_reference at(size_type idx) const
3576 // at only works for arrays
3581 return m_value.array->at(idx);
3583 JSON_CATCH (std::out_of_range&)
3585 // create better exception explanation
3586 JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range"));
3591 JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
3596 @brief access specified object element with bounds checking
3598 Returns a reference to the element at with specified key @a key, with
3601 @param[in] key key of the element to access
3603 @return reference to the element at key @a key
3605 @throw std::domain_error if the JSON value is not an object; example:
3606 `"cannot use at() with boolean"`
3607 @throw std::out_of_range if the key @a key is is not stored in the object;
3608 that is, `find(key) == end()`; example: `"key "the fast" not found"`
3610 @complexity Logarithmic in the size of the container.
3612 @liveexample{The example below shows how object elements can be read and
3613 written using `at()`.,at__object_t_key_type}
3615 @sa @ref operator[](const typename object_t::key_type&) for unchecked
3617 @sa @ref value() for access by value with a default value
3619 @since version 1.0.0
3621 reference at(const typename object_t::key_type& key)
3623 // at only works for objects
3628 return m_value.object->at(key);
3630 JSON_CATCH (std::out_of_range&)
3632 // create better exception explanation
3633 JSON_THROW(std::out_of_range("key '" + key + "' not found"));
3638 JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
3643 @brief access specified object element with bounds checking
3645 Returns a const reference to the element at with specified key @a key,
3646 with bounds checking.
3648 @param[in] key key of the element to access
3650 @return const reference to the element at key @a key
3652 @throw std::domain_error if the JSON value is not an object; example:
3653 `"cannot use at() with boolean"`
3654 @throw std::out_of_range if the key @a key is is not stored in the object;
3655 that is, `find(key) == end()`; example: `"key "the fast" not found"`
3657 @complexity Logarithmic in the size of the container.
3659 @liveexample{The example below shows how object elements can be read using
3660 `at()`.,at__object_t_key_type_const}
3662 @sa @ref operator[](const typename object_t::key_type&) for unchecked
3664 @sa @ref value() for access by value with a default value
3666 @since version 1.0.0
3668 const_reference at(const typename object_t::key_type& key) const
3670 // at only works for objects
3675 return m_value.object->at(key);
3677 JSON_CATCH (std::out_of_range&)
3679 // create better exception explanation
3680 JSON_THROW(std::out_of_range("key '" + key + "' not found"));
3685 JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
3690 @brief access specified array element
3692 Returns a reference to the element at specified location @a idx.
3694 @note If @a idx is beyond the range of the array (i.e., `idx >= size()`),
3695 then the array is silently filled up with `null` values to make `idx` a
3696 valid reference to the last stored element.
3698 @param[in] idx index of the element to access
3700 @return reference to the element at index @a idx
3702 @throw std::domain_error if JSON is not an array or null; example:
3703 `"cannot use operator[] with string"`
3705 @complexity Constant if @a idx is in the range of the array. Otherwise
3706 linear in `idx - size()`.
3708 @liveexample{The example below shows how array elements can be read and
3709 written using `[]` operator. Note the addition of `null`
3710 values.,operatorarray__size_type}
3712 @since version 1.0.0
3714 reference operator[](size_type idx)
3716 // implicitly convert null value to an empty array
3719 m_type = value_t::array;
3720 m_value.array = create<array_t>();
3724 // operator[] only works for arrays
3727 // fill up array with null values if given idx is outside range
3728 if (idx >= m_value.array->size())
3730 m_value.array->insert(m_value.array->end(),
3731 idx - m_value.array->size() + 1,
3735 return m_value.array->operator[](idx);
3738 JSON_THROW(std::domain_error("cannot use operator[] with " + type_name()));
3742 @brief access specified array element
3744 Returns a const reference to the element at specified location @a idx.
3746 @param[in] idx index of the element to access
3748 @return const reference to the element at index @a idx
3750 @throw std::domain_error if JSON is not an array; example: `"cannot use
3751 operator[] with null"`
3753 @complexity Constant.
3755 @liveexample{The example below shows how array elements can be read using
3756 the `[]` operator.,operatorarray__size_type_const}
3758 @since version 1.0.0
3760 const_reference operator[](size_type idx) const
3762 // const operator[] only works for arrays
3765 return m_value.array->operator[](idx);
3768 JSON_THROW(std::domain_error("cannot use operator[] with " + type_name()));
3772 @brief access specified object element
3774 Returns a reference to the element at with specified key @a key.
3776 @note If @a key is not found in the object, then it is silently added to
3777 the object and filled with a `null` value to make `key` a valid reference.
3778 In case the value was `null` before, it is converted to an object.
3780 @param[in] key key of the element to access
3782 @return reference to the element at key @a key
3784 @throw std::domain_error if JSON is not an object or null; example:
3785 `"cannot use operator[] with string"`
3787 @complexity Logarithmic in the size of the container.
3789 @liveexample{The example below shows how object elements can be read and
3790 written using the `[]` operator.,operatorarray__key_type}
3792 @sa @ref at(const typename object_t::key_type&) for access by reference
3794 @sa @ref value() for access by value with a default value
3796 @since version 1.0.0
3798 reference operator[](const typename object_t::key_type& key)
3800 // implicitly convert null value to an empty object
3803 m_type = value_t::object;
3804 m_value.object = create<object_t>();
3808 // operator[] only works for objects
3811 return m_value.object->operator[](key);
3814 JSON_THROW(std::domain_error("cannot use operator[] with " + type_name()));
3818 @brief read-only access specified object element
3820 Returns a const reference to the element at with specified key @a key. No
3821 bounds checking is performed.
3823 @warning If the element with key @a key does not exist, the behavior is
3826 @param[in] key key of the element to access
3828 @return const reference to the element at key @a key
3830 @pre The element with key @a key must exist. **This precondition is
3831 enforced with an assertion.**
3833 @throw std::domain_error if JSON is not an object; example: `"cannot use
3834 operator[] with null"`
3836 @complexity Logarithmic in the size of the container.
3838 @liveexample{The example below shows how object elements can be read using
3839 the `[]` operator.,operatorarray__key_type_const}
3841 @sa @ref at(const typename object_t::key_type&) for access by reference
3843 @sa @ref value() for access by value with a default value
3845 @since version 1.0.0
3847 const_reference operator[](const typename object_t::key_type& key) const
3849 // const operator[] only works for objects
3852 assert(m_value.object->find(key) != m_value.object->end());
3853 return m_value.object->find(key)->second;
3856 JSON_THROW(std::domain_error("cannot use operator[] with " + type_name()));
3860 @brief access specified object element
3862 Returns a reference to the element at with specified key @a key.
3864 @note If @a key is not found in the object, then it is silently added to
3865 the object and filled with a `null` value to make `key` a valid reference.
3866 In case the value was `null` before, it is converted to an object.
3868 @param[in] key key of the element to access
3870 @return reference to the element at key @a key
3872 @throw std::domain_error if JSON is not an object or null; example:
3873 `"cannot use operator[] with string"`
3875 @complexity Logarithmic in the size of the container.
3877 @liveexample{The example below shows how object elements can be read and
3878 written using the `[]` operator.,operatorarray__key_type}
3880 @sa @ref at(const typename object_t::key_type&) for access by reference
3882 @sa @ref value() for access by value with a default value
3884 @since version 1.0.0
3886 template<typename T, std::size_t n>
3887 reference operator[](T * (&key)[n])
3889 return operator[](static_cast<const T>(key));
3893 @brief read-only access specified object element
3895 Returns a const reference to the element at with specified key @a key. No
3896 bounds checking is performed.
3898 @warning If the element with key @a key does not exist, the behavior is
3901 @note This function is required for compatibility reasons with Clang.
3903 @param[in] key key of the element to access
3905 @return const reference to the element at key @a key
3907 @throw std::domain_error if JSON is not an object; example: `"cannot use
3908 operator[] with null"`
3910 @complexity Logarithmic in the size of the container.
3912 @liveexample{The example below shows how object elements can be read using
3913 the `[]` operator.,operatorarray__key_type_const}
3915 @sa @ref at(const typename object_t::key_type&) for access by reference
3917 @sa @ref value() for access by value with a default value
3919 @since version 1.0.0
3921 template<typename T, std::size_t n>
3922 const_reference operator[](T * (&key)[n]) const
3924 return operator[](static_cast<const T>(key));
3928 @brief access specified object element
3930 Returns a reference to the element at with specified key @a key.
3932 @note If @a key is not found in the object, then it is silently added to
3933 the object and filled with a `null` value to make `key` a valid reference.
3934 In case the value was `null` before, it is converted to an object.
3936 @param[in] key key of the element to access
3938 @return reference to the element at key @a key
3940 @throw std::domain_error if JSON is not an object or null; example:
3941 `"cannot use operator[] with string"`
3943 @complexity Logarithmic in the size of the container.
3945 @liveexample{The example below shows how object elements can be read and
3946 written using the `[]` operator.,operatorarray__key_type}
3948 @sa @ref at(const typename object_t::key_type&) for access by reference
3950 @sa @ref value() for access by value with a default value
3952 @since version 1.1.0
3954 template<typename T>
3955 reference operator[](T* key)
3957 // implicitly convert null to object
3960 m_type = value_t::object;
3961 m_value = value_t::object;
3965 // at only works for objects
3968 return m_value.object->operator[](key);
3971 JSON_THROW(std::domain_error("cannot use operator[] with " + type_name()));
3975 @brief read-only access specified object element
3977 Returns a const reference to the element at with specified key @a key. No
3978 bounds checking is performed.
3980 @warning If the element with key @a key does not exist, the behavior is
3983 @param[in] key key of the element to access
3985 @return const reference to the element at key @a key
3987 @pre The element with key @a key must exist. **This precondition is
3988 enforced with an assertion.**
3990 @throw std::domain_error if JSON is not an object; example: `"cannot use
3991 operator[] with null"`
3993 @complexity Logarithmic in the size of the container.
3995 @liveexample{The example below shows how object elements can be read using
3996 the `[]` operator.,operatorarray__key_type_const}
3998 @sa @ref at(const typename object_t::key_type&) for access by reference
4000 @sa @ref value() for access by value with a default value
4002 @since version 1.1.0
4004 template<typename T>
4005 const_reference operator[](T* key) const
4007 // at only works for objects
4010 assert(m_value.object->find(key) != m_value.object->end());
4011 return m_value.object->find(key)->second;
4014 JSON_THROW(std::domain_error("cannot use operator[] with " + type_name()));
4018 @brief access specified object element with default value
4020 Returns either a copy of an object's element at the specified key @a key
4021 or a given default value if no element with key @a key exists.
4023 The function is basically equivalent to executing
4027 } catch(std::out_of_range) {
4028 return default_value;
4032 @note Unlike @ref at(const typename object_t::key_type&), this function
4033 does not throw if the given key @a key was not found.
4035 @note Unlike @ref operator[](const typename object_t::key_type& key), this
4036 function does not implicitly add an element to the position defined by @a
4037 key. This function is furthermore also applicable to const objects.
4039 @param[in] key key of the element to access
4040 @param[in] default_value the value to return if @a key is not found
4042 @tparam ValueType type compatible to JSON values, for instance `int` for
4043 JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for
4044 JSON arrays. Note the type of the expected value at @a key and the default
4045 value @a default_value must be compatible.
4047 @return copy of the element at key @a key or @a default_value if @a key
4050 @throw std::domain_error if JSON is not an object; example: `"cannot use
4053 @complexity Logarithmic in the size of the container.
4055 @liveexample{The example below shows how object elements can be queried
4056 with a default value.,basic_json__value}
4058 @sa @ref at(const typename object_t::key_type&) for access by reference
4060 @sa @ref operator[](const typename object_t::key_type&) for unchecked
4063 @since version 1.0.0
4065 template<class ValueType, typename std::enable_if<
4066 std::is_convertible<basic_json_t, ValueType>::value, int>::type = 0>
4067 ValueType value(const typename object_t::key_type& key, ValueType default_value) const
4069 // at only works for objects
4072 // if key is found, return value and given default value otherwise
4073 const auto it = find(key);
4079 return default_value;
4083 JSON_THROW(std::domain_error("cannot use value() with " + type_name()));
4088 @brief overload for a default value of type const char*
4089 @copydoc basic_json::value(const typename object_t::key_type&, ValueType) const
4091 string_t value(const typename object_t::key_type& key, const char* default_value) const
4093 return value(key, string_t(default_value));
4097 @brief access specified object element via JSON Pointer with default value
4099 Returns either a copy of an object's element at the specified key @a key
4100 or a given default value if no element with key @a key exists.
4102 The function is basically equivalent to executing
4106 } catch(std::out_of_range) {
4107 return default_value;
4111 @note Unlike @ref at(const json_pointer&), this function does not throw
4112 if the given key @a key was not found.
4114 @param[in] ptr a JSON pointer to the element to access
4115 @param[in] default_value the value to return if @a ptr found no value
4117 @tparam ValueType type compatible to JSON values, for instance `int` for
4118 JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for
4119 JSON arrays. Note the type of the expected value at @a key and the default
4120 value @a default_value must be compatible.
4122 @return copy of the element at key @a key or @a default_value if @a key
4125 @throw std::domain_error if JSON is not an object; example: `"cannot use
4128 @complexity Logarithmic in the size of the container.
4130 @liveexample{The example below shows how object elements can be queried
4131 with a default value.,basic_json__value_ptr}
4133 @sa @ref operator[](const json_pointer&) for unchecked access by reference
4135 @since version 2.0.2
4137 template<class ValueType, typename std::enable_if<
4138 std::is_convertible<basic_json_t, ValueType>::value, int>::type = 0>
4139 ValueType value(const json_pointer& ptr, ValueType default_value) const
4141 // at only works for objects
4144 // if pointer resolves a value, return it or use default value
4147 return ptr.get_checked(this);
4149 JSON_CATCH (std::out_of_range&)
4151 return default_value;
4155 JSON_THROW(std::domain_error("cannot use value() with " + type_name()));
4159 @brief overload for a default value of type const char*
4160 @copydoc basic_json::value(const json_pointer&, ValueType) const
4162 string_t value(const json_pointer& ptr, const char* default_value) const
4164 return value(ptr, string_t(default_value));
4168 @brief access the first element
4170 Returns a reference to the first element in the container. For a JSON
4171 container `c`, the expression `c.front()` is equivalent to `*c.begin()`.
4173 @return In case of a structured type (array or object), a reference to the
4174 first element is returned. In case of number, string, or boolean values, a
4175 reference to the value is returned.
4177 @complexity Constant.
4179 @pre The JSON value must not be `null` (would throw `std::out_of_range`)
4180 or an empty array or object (undefined behavior, **guarded by
4182 @post The JSON value remains unchanged.
4184 @throw std::out_of_range when called on `null` value
4186 @liveexample{The following code shows an example for `front()`.,front}
4188 @sa @ref back() -- access the last element
4190 @since version 1.0.0
4198 @copydoc basic_json::front()
4200 const_reference front() const
4206 @brief access the last element
4208 Returns a reference to the last element in the container. For a JSON
4209 container `c`, the expression `c.back()` is equivalent to
4216 @return In case of a structured type (array or object), a reference to the
4217 last element is returned. In case of number, string, or boolean values, a
4218 reference to the value is returned.
4220 @complexity Constant.
4222 @pre The JSON value must not be `null` (would throw `std::out_of_range`)
4223 or an empty array or object (undefined behavior, **guarded by
4225 @post The JSON value remains unchanged.
4227 @throw std::out_of_range when called on `null` value.
4229 @liveexample{The following code shows an example for `back()`.,back}
4231 @sa @ref front() -- access the first element
4233 @since version 1.0.0
4243 @copydoc basic_json::back()
4245 const_reference back() const
4253 @brief remove element given an iterator
4255 Removes the element specified by iterator @a pos. The iterator @a pos must
4256 be valid and dereferenceable. Thus the `end()` iterator (which is valid,
4257 but is not dereferenceable) cannot be used as a value for @a pos.
4259 If called on a primitive type other than `null`, the resulting JSON value
4262 @param[in] pos iterator to the element to remove
4263 @return Iterator following the last removed element. If the iterator @a
4264 pos refers to the last element, the `end()` iterator is returned.
4266 @tparam IteratorType an @ref iterator or @ref const_iterator
4268 @post Invalidates iterators and references at or after the point of the
4269 erase, including the `end()` iterator.
4271 @throw std::domain_error if called on a `null` value; example: `"cannot
4272 use erase() with null"`
4273 @throw std::domain_error if called on an iterator which does not belong to
4274 the current JSON value; example: `"iterator does not fit current value"`
4275 @throw std::out_of_range if called on a primitive type with invalid
4276 iterator (i.e., any iterator which is not `begin()`); example: `"iterator
4279 @complexity The complexity depends on the type:
4280 - objects: amortized constant
4281 - arrays: linear in distance between @a pos and the end of the container
4282 - strings: linear in the length of the string
4283 - other types: constant
4285 @liveexample{The example shows the result of `erase()` for different JSON
4286 types.,erase__IteratorType}
4288 @sa @ref erase(IteratorType, IteratorType) -- removes the elements in
4290 @sa @ref erase(const typename object_t::key_type&) -- removes the element
4291 from an object at the given key
4292 @sa @ref erase(const size_type) -- removes the element from an array at
4295 @since version 1.0.0
4297 template<class IteratorType, typename std::enable_if<
4298 std::is_same<IteratorType, typename basic_json_t::iterator>::value or
4299 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int>::type
4301 IteratorType erase(IteratorType pos)
4303 // make sure iterator fits the current value
4304 if (this != pos.m_object)
4306 JSON_THROW(std::domain_error("iterator does not fit current value"));
4309 IteratorType result = end();
4313 case value_t::boolean:
4314 case value_t::number_float:
4315 case value_t::number_integer:
4316 case value_t::number_unsigned:
4317 case value_t::string:
4319 if (not pos.m_it.primitive_iterator.is_begin())
4321 JSON_THROW(std::out_of_range("iterator out of range"));
4326 AllocatorType<string_t> alloc;
4327 alloc.destroy(m_value.string);
4328 alloc.deallocate(m_value.string, 1);
4329 m_value.string = nullptr;
4332 m_type = value_t::null;
4337 case value_t::object:
4339 result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator);
4343 case value_t::array:
4345 result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator);
4351 JSON_THROW(std::domain_error("cannot use erase() with " + type_name()));
4359 @brief remove elements given an iterator range
4361 Removes the element specified by the range `[first; last)`. The iterator
4362 @a first does not need to be dereferenceable if `first == last`: erasing
4363 an empty range is a no-op.
4365 If called on a primitive type other than `null`, the resulting JSON value
4368 @param[in] first iterator to the beginning of the range to remove
4369 @param[in] last iterator past the end of the range to remove
4370 @return Iterator following the last removed element. If the iterator @a
4371 second refers to the last element, the `end()` iterator is returned.
4373 @tparam IteratorType an @ref iterator or @ref const_iterator
4375 @post Invalidates iterators and references at or after the point of the
4376 erase, including the `end()` iterator.
4378 @throw std::domain_error if called on a `null` value; example: `"cannot
4379 use erase() with null"`
4380 @throw std::domain_error if called on iterators which does not belong to
4381 the current JSON value; example: `"iterators do not fit current value"`
4382 @throw std::out_of_range if called on a primitive type with invalid
4383 iterators (i.e., if `first != begin()` and `last != end()`); example:
4384 `"iterators out of range"`
4386 @complexity The complexity depends on the type:
4387 - objects: `log(size()) + std::distance(first, last)`
4388 - arrays: linear in the distance between @a first and @a last, plus linear
4389 in the distance between @a last and end of the container
4390 - strings: linear in the length of the string
4391 - other types: constant
4393 @liveexample{The example shows the result of `erase()` for different JSON
4394 types.,erase__IteratorType_IteratorType}
4396 @sa @ref erase(IteratorType) -- removes the element at a given position
4397 @sa @ref erase(const typename object_t::key_type&) -- removes the element
4398 from an object at the given key
4399 @sa @ref erase(const size_type) -- removes the element from an array at
4402 @since version 1.0.0
4404 template<class IteratorType, typename std::enable_if<
4405 std::is_same<IteratorType, typename basic_json_t::iterator>::value or
4406 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int>::type
4408 IteratorType erase(IteratorType first, IteratorType last)
4410 // make sure iterator fits the current value
4411 if (this != first.m_object or this != last.m_object)
4413 JSON_THROW(std::domain_error("iterators do not fit current value"));
4416 IteratorType result = end();
4420 case value_t::boolean:
4421 case value_t::number_float:
4422 case value_t::number_integer:
4423 case value_t::number_unsigned:
4424 case value_t::string:
4426 if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
4428 JSON_THROW(std::out_of_range("iterators out of range"));
4433 AllocatorType<string_t> alloc;
4434 alloc.destroy(m_value.string);
4435 alloc.deallocate(m_value.string, 1);
4436 m_value.string = nullptr;
4439 m_type = value_t::null;
4444 case value_t::object:
4446 result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator,
4447 last.m_it.object_iterator);
4451 case value_t::array:
4453 result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator,
4454 last.m_it.array_iterator);
4460 JSON_THROW(std::domain_error("cannot use erase() with " + type_name()));
4468 @brief remove element from a JSON object given a key
4470 Removes elements from a JSON object with the key value @a key.
4472 @param[in] key value of the elements to remove
4474 @return Number of elements removed. If @a ObjectType is the default
4475 `std::map` type, the return value will always be `0` (@a key was not
4476 found) or `1` (@a key was found).
4478 @post References and iterators to the erased elements are invalidated.
4479 Other references and iterators are not affected.
4481 @throw std::domain_error when called on a type other than JSON object;
4482 example: `"cannot use erase() with null"`
4484 @complexity `log(size()) + count(key)`
4486 @liveexample{The example shows the effect of `erase()`.,erase__key_type}
4488 @sa @ref erase(IteratorType) -- removes the element at a given position
4489 @sa @ref erase(IteratorType, IteratorType) -- removes the elements in
4491 @sa @ref erase(const size_type) -- removes the element from an array at
4494 @since version 1.0.0
4496 size_type erase(const typename object_t::key_type& key)
4498 // this erase only works for objects
4501 return m_value.object->erase(key);
4504 JSON_THROW(std::domain_error("cannot use erase() with " + type_name()));
4508 @brief remove element from a JSON array given an index
4510 Removes element from a JSON array at the index @a idx.
4512 @param[in] idx index of the element to remove
4514 @throw std::domain_error when called on a type other than JSON array;
4515 example: `"cannot use erase() with null"`
4516 @throw std::out_of_range when `idx >= size()`; example: `"array index 17
4519 @complexity Linear in distance between @a idx and the end of the container.
4521 @liveexample{The example shows the effect of `erase()`.,erase__size_type}
4523 @sa @ref erase(IteratorType) -- removes the element at a given position
4524 @sa @ref erase(IteratorType, IteratorType) -- removes the elements in
4526 @sa @ref erase(const typename object_t::key_type&) -- removes the element
4527 from an object at the given key
4529 @since version 1.0.0
4531 void erase(const size_type idx)
4533 // this erase only works for arrays
4538 JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range"));
4541 m_value.array->erase(m_value.array->begin() + static_cast<difference_type>(idx));
4545 JSON_THROW(std::domain_error("cannot use erase() with " + type_name()));
4560 @brief find an element in a JSON object
4562 Finds an element in a JSON object with key equivalent to @a key. If the
4563 element is not found or the JSON value is not an object, end() is
4566 @note This method always returns @ref end() when executed on a JSON type
4567 that is not an object.
4569 @param[in] key key value of the element to search for
4571 @return Iterator to an element with key equivalent to @a key. If no such
4572 element is found or the JSON value is not an object, past-the-end (see
4573 @ref end()) iterator is returned.
4575 @complexity Logarithmic in the size of the JSON object.
4577 @liveexample{The example shows how `find()` is used.,find__key_type}
4579 @since version 1.0.0
4581 iterator find(typename object_t::key_type key)
4583 auto result = end();
4587 result.m_it.object_iterator = m_value.object->find(key);
4594 @brief find an element in a JSON object
4595 @copydoc find(typename object_t::key_type)
4597 const_iterator find(typename object_t::key_type key) const
4599 auto result = cend();
4603 result.m_it.object_iterator = m_value.object->find(key);
4610 @brief returns the number of occurrences of a key in a JSON object
4612 Returns the number of elements with key @a key. If ObjectType is the
4613 default `std::map` type, the return value will always be `0` (@a key was
4614 not found) or `1` (@a key was found).
4616 @note This method always returns `0` when executed on a JSON type that is
4619 @param[in] key key value of the element to count
4621 @return Number of elements with key @a key. If the JSON value is not an
4622 object, the return value will be `0`.
4624 @complexity Logarithmic in the size of the JSON object.
4626 @liveexample{The example shows how `count()` is used.,count}
4628 @since version 1.0.0
4630 size_type count(typename object_t::key_type key) const
4632 // return 0 for all nonobject types
4633 return is_object() ? m_value.object->count(key) : 0;
4647 @brief returns an iterator to the first element
4649 Returns an iterator to the first element.
4651 @image html range-begin-end.svg "Illustration from cppreference.com"
4653 @return iterator to the first element
4655 @complexity Constant.
4657 @requirement This function helps `basic_json` satisfying the
4658 [Container](http://en.cppreference.com/w/cpp/concept/Container)
4660 - The complexity is constant.
4662 @liveexample{The following code shows an example for `begin()`.,begin}
4664 @sa @ref cbegin() -- returns a const iterator to the beginning
4665 @sa @ref end() -- returns an iterator to the end
4666 @sa @ref cend() -- returns a const iterator to the end
4668 @since version 1.0.0
4670 iterator begin() noexcept
4672 iterator result(this);
4678 @copydoc basic_json::cbegin()
4680 const_iterator begin() const noexcept
4686 @brief returns a const iterator to the first element
4688 Returns a const iterator to the first element.
4690 @image html range-begin-end.svg "Illustration from cppreference.com"
4692 @return const iterator to the first element
4694 @complexity Constant.
4696 @requirement This function helps `basic_json` satisfying the
4697 [Container](http://en.cppreference.com/w/cpp/concept/Container)
4699 - The complexity is constant.
4700 - Has the semantics of `const_cast<const basic_json&>(*this).begin()`.
4702 @liveexample{The following code shows an example for `cbegin()`.,cbegin}
4704 @sa @ref begin() -- returns an iterator to the beginning
4705 @sa @ref end() -- returns an iterator to the end
4706 @sa @ref cend() -- returns a const iterator to the end
4708 @since version 1.0.0
4710 const_iterator cbegin() const noexcept
4712 const_iterator result(this);
4718 @brief returns an iterator to one past the last element
4720 Returns an iterator to one past the last element.
4722 @image html range-begin-end.svg "Illustration from cppreference.com"
4724 @return iterator one past the last element
4726 @complexity Constant.
4728 @requirement This function helps `basic_json` satisfying the
4729 [Container](http://en.cppreference.com/w/cpp/concept/Container)
4731 - The complexity is constant.
4733 @liveexample{The following code shows an example for `end()`.,end}
4735 @sa @ref cend() -- returns a const iterator to the end
4736 @sa @ref begin() -- returns an iterator to the beginning
4737 @sa @ref cbegin() -- returns a const iterator to the beginning
4739 @since version 1.0.0
4741 iterator end() noexcept
4743 iterator result(this);
4749 @copydoc basic_json::cend()
4751 const_iterator end() const noexcept
4757 @brief returns a const iterator to one past the last element
4759 Returns a const iterator to one past the last element.
4761 @image html range-begin-end.svg "Illustration from cppreference.com"
4763 @return const iterator one past the last element
4765 @complexity Constant.
4767 @requirement This function helps `basic_json` satisfying the
4768 [Container](http://en.cppreference.com/w/cpp/concept/Container)
4770 - The complexity is constant.
4771 - Has the semantics of `const_cast<const basic_json&>(*this).end()`.
4773 @liveexample{The following code shows an example for `cend()`.,cend}
4775 @sa @ref end() -- returns an iterator to the end
4776 @sa @ref begin() -- returns an iterator to the beginning
4777 @sa @ref cbegin() -- returns a const iterator to the beginning
4779 @since version 1.0.0
4781 const_iterator cend() const noexcept
4783 const_iterator result(this);
4789 @brief returns an iterator to the reverse-beginning
4791 Returns an iterator to the reverse-beginning; that is, the last element.
4793 @image html range-rbegin-rend.svg "Illustration from cppreference.com"
4795 @complexity Constant.
4797 @requirement This function helps `basic_json` satisfying the
4798 [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer)
4800 - The complexity is constant.
4801 - Has the semantics of `reverse_iterator(end())`.
4803 @liveexample{The following code shows an example for `rbegin()`.,rbegin}
4805 @sa @ref crbegin() -- returns a const reverse iterator to the beginning
4806 @sa @ref rend() -- returns a reverse iterator to the end
4807 @sa @ref crend() -- returns a const reverse iterator to the end
4809 @since version 1.0.0
4811 reverse_iterator rbegin() noexcept
4813 return reverse_iterator(end());
4817 @copydoc basic_json::crbegin()
4819 const_reverse_iterator rbegin() const noexcept
4825 @brief returns an iterator to the reverse-end
4827 Returns an iterator to the reverse-end; that is, one before the first
4830 @image html range-rbegin-rend.svg "Illustration from cppreference.com"
4832 @complexity Constant.
4834 @requirement This function helps `basic_json` satisfying the
4835 [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer)
4837 - The complexity is constant.
4838 - Has the semantics of `reverse_iterator(begin())`.
4840 @liveexample{The following code shows an example for `rend()`.,rend}
4842 @sa @ref crend() -- returns a const reverse iterator to the end
4843 @sa @ref rbegin() -- returns a reverse iterator to the beginning
4844 @sa @ref crbegin() -- returns a const reverse iterator to the beginning
4846 @since version 1.0.0
4848 reverse_iterator rend() noexcept
4850 return reverse_iterator(begin());
4854 @copydoc basic_json::crend()
4856 const_reverse_iterator rend() const noexcept
4862 @brief returns a const reverse iterator to the last element
4864 Returns a const iterator to the reverse-beginning; that is, the last
4867 @image html range-rbegin-rend.svg "Illustration from cppreference.com"
4869 @complexity Constant.
4871 @requirement This function helps `basic_json` satisfying the
4872 [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer)
4874 - The complexity is constant.
4875 - Has the semantics of `const_cast<const basic_json&>(*this).rbegin()`.
4877 @liveexample{The following code shows an example for `crbegin()`.,crbegin}
4879 @sa @ref rbegin() -- returns a reverse iterator to the beginning
4880 @sa @ref rend() -- returns a reverse iterator to the end
4881 @sa @ref crend() -- returns a const reverse iterator to the end
4883 @since version 1.0.0
4885 const_reverse_iterator crbegin() const noexcept
4887 return const_reverse_iterator(cend());
4891 @brief returns a const reverse iterator to one before the first
4893 Returns a const reverse iterator to the reverse-end; that is, one before
4896 @image html range-rbegin-rend.svg "Illustration from cppreference.com"
4898 @complexity Constant.
4900 @requirement This function helps `basic_json` satisfying the
4901 [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer)
4903 - The complexity is constant.
4904 - Has the semantics of `const_cast<const basic_json&>(*this).rend()`.
4906 @liveexample{The following code shows an example for `crend()`.,crend}
4908 @sa @ref rend() -- returns a reverse iterator to the end
4909 @sa @ref rbegin() -- returns a reverse iterator to the beginning
4910 @sa @ref crbegin() -- returns a const reverse iterator to the beginning
4912 @since version 1.0.0
4914 const_reverse_iterator crend() const noexcept
4916 return const_reverse_iterator(cbegin());
4920 // forward declaration
4921 template<typename IteratorType> class iteration_proxy;
4925 @brief wrapper to access iterator member functions in range-based for
4927 This function allows to access @ref iterator::key() and @ref
4928 iterator::value() during range-based for loops. In these loops, a
4929 reference to the JSON values is returned, so there is no access to the
4930 underlying iterator.
4932 @note The name of this function is not yet final and may change in the
4935 static iteration_proxy<iterator> iterator_wrapper(reference cont)
4937 return iteration_proxy<iterator>(cont);
4941 @copydoc iterator_wrapper(reference)
4943 static iteration_proxy<const_iterator> iterator_wrapper(const_reference cont)
4945 return iteration_proxy<const_iterator>(cont);
4959 @brief checks whether the container is empty
4961 Checks if a JSON value has no elements.
4963 @return The return value depends on the different types and is
4965 Value type | return value
4966 ----------- | -------------
4971 object | result of function `object_t::empty()`
4972 array | result of function `array_t::empty()`
4974 @note This function does not return whether a string stored as JSON value
4975 is empty - it returns whether the JSON container itself is empty which is
4976 false in the case of a string.
4978 @complexity Constant, as long as @ref array_t and @ref object_t satisfy
4979 the Container concept; that is, their `empty()` functions have constant
4982 @requirement This function helps `basic_json` satisfying the
4983 [Container](http://en.cppreference.com/w/cpp/concept/Container)
4985 - The complexity is constant.
4986 - Has the semantics of `begin() == end()`.
4988 @liveexample{The following code uses `empty()` to check if a JSON
4989 object contains any elements.,empty}
4991 @sa @ref size() -- returns the number of elements
4993 @since version 1.0.0
4995 bool empty() const noexcept
5001 // null values are empty
5005 case value_t::array:
5007 // delegate call to array_t::empty()
5008 return m_value.array->empty();
5011 case value_t::object:
5013 // delegate call to object_t::empty()
5014 return m_value.object->empty();
5019 // all other types are nonempty
5026 @brief returns the number of elements
5028 Returns the number of elements in a JSON value.
5030 @return The return value depends on the different types and is
5032 Value type | return value
5033 ----------- | -------------
5038 object | result of function object_t::size()
5039 array | result of function array_t::size()
5041 @note This function does not return the length of a string stored as JSON
5042 value - it returns the number of elements in the JSON value which is 1 in
5043 the case of a string.
5045 @complexity Constant, as long as @ref array_t and @ref object_t satisfy
5046 the Container concept; that is, their size() functions have constant
5049 @requirement This function helps `basic_json` satisfying the
5050 [Container](http://en.cppreference.com/w/cpp/concept/Container)
5052 - The complexity is constant.
5053 - Has the semantics of `std::distance(begin(), end())`.
5055 @liveexample{The following code calls `size()` on the different value
5058 @sa @ref empty() -- checks whether the container is empty
5059 @sa @ref max_size() -- returns the maximal number of elements
5061 @since version 1.0.0
5063 size_type size() const noexcept
5069 // null values are empty
5073 case value_t::array:
5075 // delegate call to array_t::size()
5076 return m_value.array->size();
5079 case value_t::object:
5081 // delegate call to object_t::size()
5082 return m_value.object->size();
5087 // all other types have size 1
5094 @brief returns the maximum possible number of elements
5096 Returns the maximum number of elements a JSON value is able to hold due to
5097 system or library implementation limitations, i.e. `std::distance(begin(),
5098 end())` for the JSON value.
5100 @return The return value depends on the different types and is
5102 Value type | return value
5103 ----------- | -------------
5104 null | `0` (same as `size()`)
5105 boolean | `1` (same as `size()`)
5106 string | `1` (same as `size()`)
5107 number | `1` (same as `size()`)
5108 object | result of function `object_t::max_size()`
5109 array | result of function `array_t::max_size()`
5111 @complexity Constant, as long as @ref array_t and @ref object_t satisfy
5112 the Container concept; that is, their `max_size()` functions have constant
5115 @requirement This function helps `basic_json` satisfying the
5116 [Container](http://en.cppreference.com/w/cpp/concept/Container)
5118 - The complexity is constant.
5119 - Has the semantics of returning `b.size()` where `b` is the largest
5120 possible JSON value.
5122 @liveexample{The following code calls `max_size()` on the different value
5123 types. Note the output is implementation specific.,max_size}
5125 @sa @ref size() -- returns the number of elements
5127 @since version 1.0.0
5129 size_type max_size() const noexcept
5133 case value_t::array:
5135 // delegate call to array_t::max_size()
5136 return m_value.array->max_size();
5139 case value_t::object:
5141 // delegate call to object_t::max_size()
5142 return m_value.object->max_size();
5147 // all other types have max_size() == size()
5164 @brief clears the contents
5166 Clears the content of a JSON value and resets it to the default value as
5167 if @ref basic_json(value_t) would have been called:
5169 Value type | initial value
5170 ----------- | -------------
5178 @complexity Linear in the size of the JSON value.
5180 @liveexample{The example below shows the effect of `clear()` to different
5183 @since version 1.0.0
5185 void clear() noexcept
5189 case value_t::number_integer:
5191 m_value.number_integer = 0;
5195 case value_t::number_unsigned:
5197 m_value.number_unsigned = 0;
5201 case value_t::number_float:
5203 m_value.number_float = 0.0;
5207 case value_t::boolean:
5209 m_value.boolean = false;
5213 case value_t::string:
5215 m_value.string->clear();
5219 case value_t::array:
5221 m_value.array->clear();
5225 case value_t::object:
5227 m_value.object->clear();
5239 @brief add an object to an array
5241 Appends the given element @a val to the end of the JSON value. If the
5242 function is called on a JSON null value, an empty array is created before
5245 @param[in] val the value to add to the JSON array
5247 @throw std::domain_error when called on a type other than JSON array or
5248 null; example: `"cannot use push_back() with number"`
5250 @complexity Amortized constant.
5252 @liveexample{The example shows how `push_back()` and `+=` can be used to
5253 add elements to a JSON array. Note how the `null` value was silently
5254 converted to a JSON array.,push_back}
5256 @since version 1.0.0
5258 void push_back(basic_json&& val)
5260 // push_back only works for null objects or arrays
5261 if (not(is_null() or is_array()))
5263 JSON_THROW(std::domain_error("cannot use push_back() with " + type_name()));
5266 // transform null object into an array
5269 m_type = value_t::array;
5270 m_value = value_t::array;
5274 // add element to array (move semantics)
5275 m_value.array->push_back(std::move(val));
5276 // invalidate object
5277 val.m_type = value_t::null;
5281 @brief add an object to an array
5282 @copydoc push_back(basic_json&&)
5284 reference operator+=(basic_json&& val)
5286 push_back(std::move(val));
5291 @brief add an object to an array
5292 @copydoc push_back(basic_json&&)
5294 void push_back(const basic_json& val)
5296 // push_back only works for null objects or arrays
5297 if (not(is_null() or is_array()))
5299 JSON_THROW(std::domain_error("cannot use push_back() with " + type_name()));
5302 // transform null object into an array
5305 m_type = value_t::array;
5306 m_value = value_t::array;
5310 // add element to array
5311 m_value.array->push_back(val);
5315 @brief add an object to an array
5316 @copydoc push_back(basic_json&&)
5318 reference operator+=(const basic_json& val)
5325 @brief add an object to an object
5327 Inserts the given element @a val to the JSON object. If the function is
5328 called on a JSON null value, an empty object is created before inserting
5331 @param[in] val the value to add to the JSON object
5333 @throw std::domain_error when called on a type other than JSON object or
5334 null; example: `"cannot use push_back() with number"`
5336 @complexity Logarithmic in the size of the container, O(log(`size()`)).
5338 @liveexample{The example shows how `push_back()` and `+=` can be used to
5339 add elements to a JSON object. Note how the `null` value was silently
5340 converted to a JSON object.,push_back__object_t__value}
5342 @since version 1.0.0
5344 void push_back(const typename object_t::value_type& val)
5346 // push_back only works for null objects or objects
5347 if (not(is_null() or is_object()))
5349 JSON_THROW(std::domain_error("cannot use push_back() with " + type_name()));
5352 // transform null object into an object
5355 m_type = value_t::object;
5356 m_value = value_t::object;
5360 // add element to array
5361 m_value.object->insert(val);
5365 @brief add an object to an object
5366 @copydoc push_back(const typename object_t::value_type&)
5368 reference operator+=(const typename object_t::value_type& val)
5375 @brief add an object to an object
5377 This function allows to use `push_back` with an initializer list. In case
5379 1. the current value is an object,
5380 2. the initializer list @a init contains only two elements, and
5381 3. the first element of @a init is a string,
5383 @a init is converted into an object element and added using
5384 @ref push_back(const typename object_t::value_type&). Otherwise, @a init
5385 is converted to a JSON value and added using @ref push_back(basic_json&&).
5387 @param init an initializer list
5389 @complexity Linear in the size of the initializer list @a init.
5391 @note This function is required to resolve an ambiguous overload error,
5392 because pairs like `{"key", "value"}` can be both interpreted as
5393 `object_t::value_type` or `std::initializer_list<basic_json>`, see
5394 https://github.com/nlohmann/json/issues/235 for more information.
5396 @liveexample{The example shows how initializer lists are treated as
5397 objects when possible.,push_back__initializer_list}
5399 void push_back(std::initializer_list<basic_json> init)
5401 if (is_object() and init.size() == 2 and init.begin()->is_string())
5403 const string_t key = *init.begin();
5404 push_back(typename object_t::value_type(key, *(init.begin() + 1)));
5408 push_back(basic_json(init));
5413 @brief add an object to an object
5414 @copydoc push_back(std::initializer_list<basic_json>)
5416 reference operator+=(std::initializer_list<basic_json> init)
5423 @brief add an object to an array
5425 Creates a JSON value from the passed parameters @a args to the end of the
5426 JSON value. If the function is called on a JSON null value, an empty array
5427 is created before appending the value created from @a args.
5429 @param[in] args arguments to forward to a constructor of @ref basic_json
5430 @tparam Args compatible types to create a @ref basic_json object
5432 @throw std::domain_error when called on a type other than JSON array or
5433 null; example: `"cannot use emplace_back() with number"`
5435 @complexity Amortized constant.
5437 @liveexample{The example shows how `push_back()` can be used to add
5438 elements to a JSON array. Note how the `null` value was silently converted
5439 to a JSON array.,emplace_back}
5441 @since version 2.0.8
5443 template<class... Args>
5444 void emplace_back(Args&& ... args)
5446 // emplace_back only works for null objects or arrays
5447 if (not(is_null() or is_array()))
5449 JSON_THROW(std::domain_error("cannot use emplace_back() with " + type_name()));
5452 // transform null object into an array
5455 m_type = value_t::array;
5456 m_value = value_t::array;
5460 // add element to array (perfect forwarding)
5461 m_value.array->emplace_back(std::forward<Args>(args)...);
5465 @brief add an object to an object if key does not exist
5467 Inserts a new element into a JSON object constructed in-place with the
5468 given @a args if there is no element with the key in the container. If the
5469 function is called on a JSON null value, an empty object is created before
5470 appending the value created from @a args.
5472 @param[in] args arguments to forward to a constructor of @ref basic_json
5473 @tparam Args compatible types to create a @ref basic_json object
5475 @return a pair consisting of an iterator to the inserted element, or the
5476 already-existing element if no insertion happened, and a bool
5477 denoting whether the insertion took place.
5479 @throw std::domain_error when called on a type other than JSON object or
5480 null; example: `"cannot use emplace() with number"`
5482 @complexity Logarithmic in the size of the container, O(log(`size()`)).
5484 @liveexample{The example shows how `emplace()` can be used to add elements
5485 to a JSON object. Note how the `null` value was silently converted to a
5486 JSON object. Further note how no value is added if there was already one
5487 value stored with the same key.,emplace}
5489 @since version 2.0.8
5491 template<class... Args>
5492 std::pair<iterator, bool> emplace(Args&& ... args)
5494 // emplace only works for null objects or arrays
5495 if (not(is_null() or is_object()))
5497 JSON_THROW(std::domain_error("cannot use emplace() with " + type_name()));
5500 // transform null object into an object
5503 m_type = value_t::object;
5504 m_value = value_t::object;
5508 // add element to array (perfect forwarding)
5509 auto res = m_value.object->emplace(std::forward<Args>(args)...);
5510 // create result iterator and set iterator to the result of emplace
5512 it.m_it.object_iterator = res.first;
5514 // return pair of iterator and boolean
5515 return {it, res.second};
5519 @brief inserts element
5521 Inserts element @a val before iterator @a pos.
5523 @param[in] pos iterator before which the content will be inserted; may be
5525 @param[in] val element to insert
5526 @return iterator pointing to the inserted @a val.
5528 @throw std::domain_error if called on JSON values other than arrays;
5529 example: `"cannot use insert() with string"`
5530 @throw std::domain_error if @a pos is not an iterator of *this; example:
5531 `"iterator does not fit current value"`
5533 @complexity Constant plus linear in the distance between @a pos and end of
5536 @liveexample{The example shows how `insert()` is used.,insert}
5538 @since version 1.0.0
5540 iterator insert(const_iterator pos, const basic_json& val)
5542 // insert only works for arrays
5545 // check if iterator pos fits to this JSON value
5546 if (pos.m_object != this)
5548 JSON_THROW(std::domain_error("iterator does not fit current value"));
5551 // insert to array and return iterator
5552 iterator result(this);
5553 result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val);
5557 JSON_THROW(std::domain_error("cannot use insert() with " + type_name()));
5561 @brief inserts element
5562 @copydoc insert(const_iterator, const basic_json&)
5564 iterator insert(const_iterator pos, basic_json&& val)
5566 return insert(pos, val);
5570 @brief inserts elements
5572 Inserts @a cnt copies of @a val before iterator @a pos.
5574 @param[in] pos iterator before which the content will be inserted; may be
5576 @param[in] cnt number of copies of @a val to insert
5577 @param[in] val element to insert
5578 @return iterator pointing to the first element inserted, or @a pos if
5581 @throw std::domain_error if called on JSON values other than arrays;
5582 example: `"cannot use insert() with string"`
5583 @throw std::domain_error if @a pos is not an iterator of *this; example:
5584 `"iterator does not fit current value"`
5586 @complexity Linear in @a cnt plus linear in the distance between @a pos
5587 and end of the container.
5589 @liveexample{The example shows how `insert()` is used.,insert__count}
5591 @since version 1.0.0
5593 iterator insert(const_iterator pos, size_type cnt, const basic_json& val)
5595 // insert only works for arrays
5598 // check if iterator pos fits to this JSON value
5599 if (pos.m_object != this)
5601 JSON_THROW(std::domain_error("iterator does not fit current value"));
5604 // insert to array and return iterator
5605 iterator result(this);
5606 result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);
5610 JSON_THROW(std::domain_error("cannot use insert() with " + type_name()));
5614 @brief inserts elements
5616 Inserts elements from range `[first, last)` before iterator @a pos.
5618 @param[in] pos iterator before which the content will be inserted; may be
5620 @param[in] first begin of the range of elements to insert
5621 @param[in] last end of the range of elements to insert
5623 @throw std::domain_error if called on JSON values other than arrays;
5624 example: `"cannot use insert() with string"`
5625 @throw std::domain_error if @a pos is not an iterator of *this; example:
5626 `"iterator does not fit current value"`
5627 @throw std::domain_error if @a first and @a last do not belong to the same
5628 JSON value; example: `"iterators do not fit"`
5629 @throw std::domain_error if @a first or @a last are iterators into
5630 container for which insert is called; example: `"passed iterators may not
5631 belong to container"`
5633 @return iterator pointing to the first element inserted, or @a pos if
5636 @complexity Linear in `std::distance(first, last)` plus linear in the
5637 distance between @a pos and end of the container.
5639 @liveexample{The example shows how `insert()` is used.,insert__range}
5641 @since version 1.0.0
5643 iterator insert(const_iterator pos, const_iterator first, const_iterator last)
5645 // insert only works for arrays
5648 JSON_THROW(std::domain_error("cannot use insert() with " + type_name()));
5651 // check if iterator pos fits to this JSON value
5652 if (pos.m_object != this)
5654 JSON_THROW(std::domain_error("iterator does not fit current value"));
5657 // check if range iterators belong to the same JSON object
5658 if (first.m_object != last.m_object)
5660 JSON_THROW(std::domain_error("iterators do not fit"));
5663 if (first.m_object == this or last.m_object == this)
5665 JSON_THROW(std::domain_error("passed iterators may not belong to container"));
5668 // insert to array and return iterator
5669 iterator result(this);
5670 result.m_it.array_iterator = m_value.array->insert(
5671 pos.m_it.array_iterator,
5672 first.m_it.array_iterator,
5673 last.m_it.array_iterator);
5678 @brief inserts elements
5680 Inserts elements from initializer list @a ilist before iterator @a pos.
5682 @param[in] pos iterator before which the content will be inserted; may be
5684 @param[in] ilist initializer list to insert the values from
5686 @throw std::domain_error if called on JSON values other than arrays;
5687 example: `"cannot use insert() with string"`
5688 @throw std::domain_error if @a pos is not an iterator of *this; example:
5689 `"iterator does not fit current value"`
5691 @return iterator pointing to the first element inserted, or @a pos if
5694 @complexity Linear in `ilist.size()` plus linear in the distance between
5695 @a pos and end of the container.
5697 @liveexample{The example shows how `insert()` is used.,insert__ilist}
5699 @since version 1.0.0
5701 iterator insert(const_iterator pos, std::initializer_list<basic_json> ilist)
5703 // insert only works for arrays
5706 JSON_THROW(std::domain_error("cannot use insert() with " + type_name()));
5709 // check if iterator pos fits to this JSON value
5710 if (pos.m_object != this)
5712 JSON_THROW(std::domain_error("iterator does not fit current value"));
5715 // insert to array and return iterator
5716 iterator result(this);
5717 result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist);
5722 @brief exchanges the values
5724 Exchanges the contents of the JSON value with those of @a other. Does not
5725 invoke any move, copy, or swap operations on individual elements. All
5726 iterators and references remain valid. The past-the-end iterator is
5729 @param[in,out] other JSON value to exchange the contents with
5731 @complexity Constant.
5733 @liveexample{The example below shows how JSON values can be swapped with
5734 `swap()`.,swap__reference}
5736 @since version 1.0.0
5738 void swap(reference other) noexcept (
5739 std::is_nothrow_move_constructible<value_t>::value and
5740 std::is_nothrow_move_assignable<value_t>::value and
5741 std::is_nothrow_move_constructible<json_value>::value and
5742 std::is_nothrow_move_assignable<json_value>::value
5745 std::swap(m_type, other.m_type);
5746 std::swap(m_value, other.m_value);
5751 @brief exchanges the values
5753 Exchanges the contents of a JSON array with those of @a other. Does not
5754 invoke any move, copy, or swap operations on individual elements. All
5755 iterators and references remain valid. The past-the-end iterator is
5758 @param[in,out] other array to exchange the contents with
5760 @throw std::domain_error when JSON value is not an array; example:
5761 `"cannot use swap() with string"`
5763 @complexity Constant.
5765 @liveexample{The example below shows how arrays can be swapped with
5766 `swap()`.,swap__array_t}
5768 @since version 1.0.0
5770 void swap(array_t& other)
5772 // swap only works for arrays
5775 std::swap(*(m_value.array), other);
5779 JSON_THROW(std::domain_error("cannot use swap() with " + type_name()));
5784 @brief exchanges the values
5786 Exchanges the contents of a JSON object with those of @a other. Does not
5787 invoke any move, copy, or swap operations on individual elements. All
5788 iterators and references remain valid. The past-the-end iterator is
5791 @param[in,out] other object to exchange the contents with
5793 @throw std::domain_error when JSON value is not an object; example:
5794 `"cannot use swap() with string"`
5796 @complexity Constant.
5798 @liveexample{The example below shows how objects can be swapped with
5799 `swap()`.,swap__object_t}
5801 @since version 1.0.0
5803 void swap(object_t& other)
5805 // swap only works for objects
5808 std::swap(*(m_value.object), other);
5812 JSON_THROW(std::domain_error("cannot use swap() with " + type_name()));
5817 @brief exchanges the values
5819 Exchanges the contents of a JSON string with those of @a other. Does not
5820 invoke any move, copy, or swap operations on individual elements. All
5821 iterators and references remain valid. The past-the-end iterator is
5824 @param[in,out] other string to exchange the contents with
5826 @throw std::domain_error when JSON value is not a string; example: `"cannot
5827 use swap() with boolean"`
5829 @complexity Constant.
5831 @liveexample{The example below shows how strings can be swapped with
5832 `swap()`.,swap__string_t}
5834 @since version 1.0.0
5836 void swap(string_t& other)
5838 // swap only works for strings
5841 std::swap(*(m_value.string), other);
5845 JSON_THROW(std::domain_error("cannot use swap() with " + type_name()));
5852 //////////////////////////////////////////
5853 // lexicographical comparison operators //
5854 //////////////////////////////////////////
5856 /// @name lexicographical comparison operators
5860 @brief comparison: equal
5862 Compares two JSON values for equality according to the following rules:
5863 - Two JSON values are equal if (1) they are from the same type and (2)
5864 their stored values are the same.
5865 - Integer and floating-point numbers are automatically converted before
5866 comparison. Floating-point numbers are compared indirectly: two
5867 floating-point numbers `f1` and `f2` are considered equal if neither
5868 `f1 > f2` nor `f2 > f1` holds.
5869 - Two JSON null values are equal.
5871 @param[in] lhs first JSON value to consider
5872 @param[in] rhs second JSON value to consider
5873 @return whether the values @a lhs and @a rhs are equal
5877 @liveexample{The example demonstrates comparing several JSON
5878 types.,operator__equal}
5880 @since version 1.0.0
5882 friend bool operator==(const_reference lhs, const_reference rhs) noexcept
5884 const auto lhs_type = lhs.type();
5885 const auto rhs_type = rhs.type();
5887 if (lhs_type == rhs_type)
5891 case value_t::array:
5893 return *lhs.m_value.array == *rhs.m_value.array;
5895 case value_t::object:
5897 return *lhs.m_value.object == *rhs.m_value.object;
5903 case value_t::string:
5905 return *lhs.m_value.string == *rhs.m_value.string;
5907 case value_t::boolean:
5909 return lhs.m_value.boolean == rhs.m_value.boolean;
5911 case value_t::number_integer:
5913 return lhs.m_value.number_integer == rhs.m_value.number_integer;
5915 case value_t::number_unsigned:
5917 return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned;
5919 case value_t::number_float:
5921 return lhs.m_value.number_float == rhs.m_value.number_float;
5929 else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float)
5931 return static_cast<number_float_t>(lhs.m_value.number_integer) == rhs.m_value.number_float;
5933 else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer)
5935 return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer);
5937 else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float)
5939 return static_cast<number_float_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_float;
5941 else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned)
5943 return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_unsigned);
5945 else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer)
5947 return static_cast<number_integer_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_integer;
5949 else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned)
5951 return lhs.m_value.number_integer == static_cast<number_integer_t>(rhs.m_value.number_unsigned);
5958 @brief comparison: equal
5959 @copydoc operator==(const_reference, const_reference)
5961 template<typename ScalarType, typename std::enable_if<
5962 std::is_scalar<ScalarType>::value, int>::type = 0>
5963 friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept
5965 return (lhs == basic_json(rhs));
5969 @brief comparison: equal
5970 @copydoc operator==(const_reference, const_reference)
5972 template<typename ScalarType, typename std::enable_if<
5973 std::is_scalar<ScalarType>::value, int>::type = 0>
5974 friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept
5976 return (basic_json(lhs) == rhs);
5980 @brief comparison: not equal
5982 Compares two JSON values for inequality by calculating `not (lhs == rhs)`.
5984 @param[in] lhs first JSON value to consider
5985 @param[in] rhs second JSON value to consider
5986 @return whether the values @a lhs and @a rhs are not equal
5990 @liveexample{The example demonstrates comparing several JSON
5991 types.,operator__notequal}
5993 @since version 1.0.0
5995 friend bool operator!=(const_reference lhs, const_reference rhs) noexcept
5997 return not (lhs == rhs);
6001 @brief comparison: not equal
6002 @copydoc operator!=(const_reference, const_reference)
6004 template<typename ScalarType, typename std::enable_if<
6005 std::is_scalar<ScalarType>::value, int>::type = 0>
6006 friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept
6008 return (lhs != basic_json(rhs));
6012 @brief comparison: not equal
6013 @copydoc operator!=(const_reference, const_reference)
6015 template<typename ScalarType, typename std::enable_if<
6016 std::is_scalar<ScalarType>::value, int>::type = 0>
6017 friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept
6019 return (basic_json(lhs) != rhs);
6023 @brief comparison: less than
6025 Compares whether one JSON value @a lhs is less than another JSON value @a
6026 rhs according to the following rules:
6027 - If @a lhs and @a rhs have the same type, the values are compared using
6028 the default `<` operator.
6029 - Integer and floating-point numbers are automatically converted before
6031 - In case @a lhs and @a rhs have different types, the values are ignored
6032 and the order of the types is considered, see
6033 @ref operator<(const value_t, const value_t).
6035 @param[in] lhs first JSON value to consider
6036 @param[in] rhs second JSON value to consider
6037 @return whether @a lhs is less than @a rhs
6041 @liveexample{The example demonstrates comparing several JSON
6042 types.,operator__less}
6044 @since version 1.0.0
6046 friend bool operator<(const_reference lhs, const_reference rhs) noexcept
6048 const auto lhs_type = lhs.type();
6049 const auto rhs_type = rhs.type();
6051 if (lhs_type == rhs_type)
6055 case value_t::array:
6057 return *lhs.m_value.array < *rhs.m_value.array;
6059 case value_t::object:
6061 return *lhs.m_value.object < *rhs.m_value.object;
6067 case value_t::string:
6069 return *lhs.m_value.string < *rhs.m_value.string;
6071 case value_t::boolean:
6073 return lhs.m_value.boolean < rhs.m_value.boolean;
6075 case value_t::number_integer:
6077 return lhs.m_value.number_integer < rhs.m_value.number_integer;
6079 case value_t::number_unsigned:
6081 return lhs.m_value.number_unsigned < rhs.m_value.number_unsigned;
6083 case value_t::number_float:
6085 return lhs.m_value.number_float < rhs.m_value.number_float;
6093 else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float)
6095 return static_cast<number_float_t>(lhs.m_value.number_integer) < rhs.m_value.number_float;
6097 else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer)
6099 return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_integer);
6101 else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float)
6103 return static_cast<number_float_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_float;
6105 else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned)
6107 return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_unsigned);
6109 else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned)
6111 return lhs.m_value.number_integer < static_cast<number_integer_t>(rhs.m_value.number_unsigned);
6113 else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer)
6115 return static_cast<number_integer_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_integer;
6118 // We only reach this line if we cannot compare values. In that case,
6119 // we compare types. Note we have to call the operator explicitly,
6120 // because MSVC has problems otherwise.
6121 return operator<(lhs_type, rhs_type);
6125 @brief comparison: less than or equal
6127 Compares whether one JSON value @a lhs is less than or equal to another
6128 JSON value by calculating `not (rhs < lhs)`.
6130 @param[in] lhs first JSON value to consider
6131 @param[in] rhs second JSON value to consider
6132 @return whether @a lhs is less than or equal to @a rhs
6136 @liveexample{The example demonstrates comparing several JSON
6137 types.,operator__greater}
6139 @since version 1.0.0
6141 friend bool operator<=(const_reference lhs, const_reference rhs) noexcept
6143 return not (rhs < lhs);
6147 @brief comparison: greater than
6149 Compares whether one JSON value @a lhs is greater than another
6150 JSON value by calculating `not (lhs <= rhs)`.
6152 @param[in] lhs first JSON value to consider
6153 @param[in] rhs second JSON value to consider
6154 @return whether @a lhs is greater than to @a rhs
6158 @liveexample{The example demonstrates comparing several JSON
6159 types.,operator__lessequal}
6161 @since version 1.0.0
6163 friend bool operator>(const_reference lhs, const_reference rhs) noexcept
6165 return not (lhs <= rhs);
6169 @brief comparison: greater than or equal
6171 Compares whether one JSON value @a lhs is greater than or equal to another
6172 JSON value by calculating `not (lhs < rhs)`.
6174 @param[in] lhs first JSON value to consider
6175 @param[in] rhs second JSON value to consider
6176 @return whether @a lhs is greater than or equal to @a rhs
6180 @liveexample{The example demonstrates comparing several JSON
6181 types.,operator__greaterequal}
6183 @since version 1.0.0
6185 friend bool operator>=(const_reference lhs, const_reference rhs) noexcept
6187 return not (lhs < rhs);
6197 /// @name serialization
6201 @brief serialize to stream
6203 Serialize the given JSON value @a j to the output stream @a o. The JSON
6204 value will be serialized using the @ref dump member function. The
6205 indentation of the output can be controlled with the member variable
6206 `width` of the output stream @a o. For instance, using the manipulator
6207 `std::setw(4)` on @a o sets the indentation level to `4` and the
6208 serialization result is the same as calling `dump(4)`.
6210 @param[in,out] o stream to serialize to
6211 @param[in] j JSON value to serialize
6213 @return the stream @a o
6217 @liveexample{The example below shows the serialization with different
6218 parameters to `width` to adjust the indentation level.,operator_serialize}
6220 @since version 1.0.0
6222 friend std::ostream& operator<<(std::ostream& o, const basic_json& j)
6224 // read width member and use it as indentation parameter if nonzero
6225 const bool pretty_print = (o.width() > 0);
6226 const auto indentation = (pretty_print ? o.width() : 0);
6228 // reset width to 0 for subsequent calls to this stream
6231 // do the actual serialization
6232 j.dump(o, pretty_print, static_cast<unsigned int>(indentation));
6238 @brief serialize to stream
6239 @copydoc operator<<(std::ostream&, const basic_json&)
6241 friend std::ostream& operator>>(const basic_json& j, std::ostream& o)
6249 /////////////////////
6250 // deserialization //
6251 /////////////////////
6253 /// @name deserialization
6257 @brief deserialize from an array
6259 This function reads from an array of 1-byte values.
6261 @pre Each element of the container has a size of 1 byte. Violating this
6262 precondition yields undefined behavior. **This precondition is enforced
6263 with a static assertion.**
6265 @param[in] array array to read from
6266 @param[in] cb a parser callback function of type @ref parser_callback_t
6267 which is used to control the deserialization by filtering unwanted values
6270 @return result of the deserialization
6272 @complexity Linear in the length of the input. The parser is a predictive
6273 LL(1) parser. The complexity can be higher if the parser callback function
6274 @a cb has a super-linear complexity.
6276 @note A UTF-8 byte order mark is silently ignored.
6278 @liveexample{The example below demonstrates the `parse()` function reading
6279 from an array.,parse__array__parser_callback_t}
6281 @since version 2.0.3
6283 template<class T, std::size_t N>
6284 static basic_json parse(T (&array)[N],
6285 const parser_callback_t cb = nullptr)
6287 // delegate the call to the iterator-range parse overload
6288 return parse(std::begin(array), std::end(array), cb);
6292 @brief deserialize from string literal
6294 @tparam CharT character/literal type with size of 1 byte
6295 @param[in] s string literal to read a serialized JSON value from
6296 @param[in] cb a parser callback function of type @ref parser_callback_t
6297 which is used to control the deserialization by filtering unwanted values
6300 @return result of the deserialization
6302 @complexity Linear in the length of the input. The parser is a predictive
6303 LL(1) parser. The complexity can be higher if the parser callback function
6304 @a cb has a super-linear complexity.
6306 @note A UTF-8 byte order mark is silently ignored.
6307 @note String containers like `std::string` or @ref string_t can be parsed
6308 with @ref parse(const ContiguousContainer&, const parser_callback_t)
6310 @liveexample{The example below demonstrates the `parse()` function with
6311 and without callback function.,parse__string__parser_callback_t}
6313 @sa @ref parse(std::istream&, const parser_callback_t) for a version that
6314 reads from an input stream
6316 @since version 1.0.0 (originally for @ref string_t)
6318 template<typename CharT, typename std::enable_if<
6319 std::is_pointer<CharT>::value and
6320 std::is_integral<typename std::remove_pointer<CharT>::type>::value and
6321 sizeof(typename std::remove_pointer<CharT>::type) == 1, int>::type = 0>
6322 static basic_json parse(const CharT s,
6323 const parser_callback_t cb = nullptr)
6325 return parser(reinterpret_cast<const char*>(s), cb).parse();
6329 @brief deserialize from stream
6331 @param[in,out] i stream to read a serialized JSON value from
6332 @param[in] cb a parser callback function of type @ref parser_callback_t
6333 which is used to control the deserialization by filtering unwanted values
6336 @return result of the deserialization
6338 @complexity Linear in the length of the input. The parser is a predictive
6339 LL(1) parser. The complexity can be higher if the parser callback function
6340 @a cb has a super-linear complexity.
6342 @note A UTF-8 byte order mark is silently ignored.
6344 @liveexample{The example below demonstrates the `parse()` function with
6345 and without callback function.,parse__istream__parser_callback_t}
6347 @sa @ref parse(const CharT, const parser_callback_t) for a version
6348 that reads from a string
6350 @since version 1.0.0
6352 static basic_json parse(std::istream& i,
6353 const parser_callback_t cb = nullptr)
6355 return parser(i, cb).parse();
6359 @copydoc parse(std::istream&, const parser_callback_t)
6361 static basic_json parse(std::istream&& i,
6362 const parser_callback_t cb = nullptr)
6364 return parser(i, cb).parse();
6368 @brief deserialize from an iterator range with contiguous storage
6370 This function reads from an iterator range of a container with contiguous
6371 storage of 1-byte values. Compatible container types include
6372 `std::vector`, `std::string`, `std::array`, `std::valarray`, and
6373 `std::initializer_list`. Furthermore, C-style arrays can be used with
6374 `std::begin()`/`std::end()`. User-defined containers can be used as long
6375 as they implement random-access iterators and a contiguous storage.
6377 @pre The iterator range is contiguous. Violating this precondition yields
6378 undefined behavior. **This precondition is enforced with an assertion.**
6379 @pre Each element in the range has a size of 1 byte. Violating this
6380 precondition yields undefined behavior. **This precondition is enforced
6381 with a static assertion.**
6383 @warning There is no way to enforce all preconditions at compile-time. If
6384 the function is called with noncompliant iterators and with
6385 assertions switched off, the behavior is undefined and will most
6386 likely yield segmentation violation.
6388 @tparam IteratorType iterator of container with contiguous storage
6389 @param[in] first begin of the range to parse (included)
6390 @param[in] last end of the range to parse (excluded)
6391 @param[in] cb a parser callback function of type @ref parser_callback_t
6392 which is used to control the deserialization by filtering unwanted values
6395 @return result of the deserialization
6397 @complexity Linear in the length of the input. The parser is a predictive
6398 LL(1) parser. The complexity can be higher if the parser callback function
6399 @a cb has a super-linear complexity.
6401 @note A UTF-8 byte order mark is silently ignored.
6403 @liveexample{The example below demonstrates the `parse()` function reading
6404 from an iterator range.,parse__iteratortype__parser_callback_t}
6406 @since version 2.0.3
6408 template<class IteratorType, typename std::enable_if<
6410 std::random_access_iterator_tag,
6411 typename std::iterator_traits<IteratorType>::iterator_category>::value, int>::type = 0>
6412 static basic_json parse(IteratorType first, IteratorType last,
6413 const parser_callback_t cb = nullptr)
6415 // assertion to check that the iterator range is indeed contiguous,
6416 // see http://stackoverflow.com/a/35008842/266378 for more discussion
6417 assert(std::accumulate(first, last, std::pair<bool, int>(true, 0),
6418 [&first](std::pair<bool, int> res, decltype(*first) val)
6420 res.first &= (val == *(std::next(std::addressof(*first), res.second++)));
6424 // assertion to check that each element is 1 byte long
6425 static_assert(sizeof(typename std::iterator_traits<IteratorType>::value_type) == 1,
6426 "each element in the iterator range must have the size of 1 byte");
6428 // if iterator range is empty, create a parser with an empty string
6429 // to generate "unexpected EOF" error message
6430 if (std::distance(first, last) <= 0)
6432 return parser("").parse();
6435 return parser(first, last, cb).parse();
6439 @brief deserialize from a container with contiguous storage
6441 This function reads from a container with contiguous storage of 1-byte
6442 values. Compatible container types include `std::vector`, `std::string`,
6443 `std::array`, and `std::initializer_list`. User-defined containers can be
6444 used as long as they implement random-access iterators and a contiguous
6447 @pre The container storage is contiguous. Violating this precondition
6448 yields undefined behavior. **This precondition is enforced with an
6450 @pre Each element of the container has a size of 1 byte. Violating this
6451 precondition yields undefined behavior. **This precondition is enforced
6452 with a static assertion.**
6454 @warning There is no way to enforce all preconditions at compile-time. If
6455 the function is called with a noncompliant container and with
6456 assertions switched off, the behavior is undefined and will most
6457 likely yield segmentation violation.
6459 @tparam ContiguousContainer container type with contiguous storage
6460 @param[in] c container to read from
6461 @param[in] cb a parser callback function of type @ref parser_callback_t
6462 which is used to control the deserialization by filtering unwanted values
6465 @return result of the deserialization
6467 @complexity Linear in the length of the input. The parser is a predictive
6468 LL(1) parser. The complexity can be higher if the parser callback function
6469 @a cb has a super-linear complexity.
6471 @note A UTF-8 byte order mark is silently ignored.
6473 @liveexample{The example below demonstrates the `parse()` function reading
6474 from a contiguous container.,parse__contiguouscontainer__parser_callback_t}
6476 @since version 2.0.3
6478 template<class ContiguousContainer, typename std::enable_if<
6479 not std::is_pointer<ContiguousContainer>::value and
6481 std::random_access_iterator_tag,
6482 typename std::iterator_traits<decltype(std::begin(std::declval<ContiguousContainer const>()))>::iterator_category>::value
6484 static basic_json parse(const ContiguousContainer& c,
6485 const parser_callback_t cb = nullptr)
6487 // delegate the call to the iterator-range parse overload
6488 return parse(std::begin(c), std::end(c), cb);
6492 @brief deserialize from stream
6494 Deserializes an input stream to a JSON value.
6496 @param[in,out] i input stream to read a serialized JSON value from
6497 @param[in,out] j JSON value to write the deserialized input to
6499 @throw std::invalid_argument in case of parse errors
6501 @complexity Linear in the length of the input. The parser is a predictive
6504 @note A UTF-8 byte order mark is silently ignored.
6506 @liveexample{The example below shows how a JSON value is constructed by
6507 reading a serialization from a stream.,operator_deserialize}
6509 @sa parse(std::istream&, const parser_callback_t) for a variant with a
6510 parser callback function to filter values while parsing
6512 @since version 1.0.0
6514 friend std::istream& operator<<(basic_json& j, std::istream& i)
6516 j = parser(i).parse();
6521 @brief deserialize from stream
6522 @copydoc operator<<(basic_json&, std::istream&)
6524 friend std::istream& operator>>(std::istream& i, basic_json& j)
6526 j = parser(i).parse();
6532 //////////////////////////////////////////
6533 // binary serialization/deserialization //
6534 //////////////////////////////////////////
6536 /// @name binary serialization/deserialization support
6541 @note Some code in the switch cases has been copied, because otherwise
6542 copilers would complain about implicit fallthrough and there is no
6543 portable attribute to mute such warnings.
6545 template<typename T>
6546 static void add_to_vector(std::vector<uint8_t>& vec, size_t bytes, const T number)
6548 assert(bytes == 1 or bytes == 2 or bytes == 4 or bytes == 8);
6554 vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 070) & 0xff));
6555 vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 060) & 0xff));
6556 vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 050) & 0xff));
6557 vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 040) & 0xff));
6558 vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff));
6559 vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff));
6560 vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
6561 vec.push_back(static_cast<uint8_t>(number & 0xff));
6567 vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff));
6568 vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff));
6569 vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
6570 vec.push_back(static_cast<uint8_t>(number & 0xff));
6576 vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
6577 vec.push_back(static_cast<uint8_t>(number & 0xff));
6583 vec.push_back(static_cast<uint8_t>(number & 0xff));
6590 @brief take sufficient bytes from a vector to fill an integer variable
6592 In the context of binary serialization formats, we need to read several
6593 bytes from a byte vector and combine them to multi-byte integral data
6596 @param[in] vec byte vector to read from
6597 @param[in] current_index the position in the vector after which to read
6599 @return the next sizeof(T) bytes from @a vec, in reverse order as T
6601 @tparam T the integral return type
6603 @throw std::out_of_range if there are less than sizeof(T)+1 bytes in the
6604 vector @a vec to read
6606 In the for loop, the bytes from the vector are copied in reverse order into
6607 the return value. In the figures below, let sizeof(T)=4 and `i` be the loop
6612 vec: | | | a | b | c | d | T: | | | | |
6614 current_index i ptr sizeof(T)
6618 vec: | | | a | b | c | d | T: | d | c | b | a |
6623 @sa Code adapted from <http://stackoverflow.com/a/41031865/266378>.
6625 template<typename T>
6626 static T get_from_vector(const std::vector<uint8_t>& vec, const size_t current_index)
6628 if (current_index + sizeof(T) + 1 > vec.size())
6630 JSON_THROW(std::out_of_range("cannot read " + std::to_string(sizeof(T)) + " bytes from vector"));
6634 auto* ptr = reinterpret_cast<uint8_t*>(&result);
6635 for (size_t i = 0; i < sizeof(T); ++i)
6637 *ptr++ = vec[current_index + sizeof(T) - i];
6643 @brief create a MessagePack serialization of a given JSON value
6645 This is a straightforward implementation of the MessagePack specification.
6647 @param[in] j JSON value to serialize
6648 @param[in,out] v byte vector to write the serialization to
6650 @sa https://github.com/msgpack/msgpack/blob/master/spec.md
6652 static void to_msgpack_internal(const basic_json& j, std::vector<uint8_t>& v)
6663 case value_t::boolean:
6666 v.push_back(j.m_value.boolean ? 0xc3 : 0xc2);
6670 case value_t::number_integer:
6672 if (j.m_value.number_integer >= 0)
6674 // MessagePack does not differentiate between positive
6675 // signed integers and unsigned integers. Therefore, we
6676 // used the code from the value_t::number_unsigned case
6678 if (j.m_value.number_unsigned < 128)
6681 add_to_vector(v, 1, j.m_value.number_unsigned);
6683 else if (j.m_value.number_unsigned <= std::numeric_limits<uint8_t>::max())
6687 add_to_vector(v, 1, j.m_value.number_unsigned);
6689 else if (j.m_value.number_unsigned <= std::numeric_limits<uint16_t>::max())
6693 add_to_vector(v, 2, j.m_value.number_unsigned);
6695 else if (j.m_value.number_unsigned <= std::numeric_limits<uint32_t>::max())
6699 add_to_vector(v, 4, j.m_value.number_unsigned);
6701 else if (j.m_value.number_unsigned <= std::numeric_limits<uint64_t>::max())
6705 add_to_vector(v, 8, j.m_value.number_unsigned);
6710 if (j.m_value.number_integer >= -32)
6713 add_to_vector(v, 1, j.m_value.number_integer);
6715 else if (j.m_value.number_integer >= std::numeric_limits<int8_t>::min() and j.m_value.number_integer <= std::numeric_limits<int8_t>::max())
6719 add_to_vector(v, 1, j.m_value.number_integer);
6721 else if (j.m_value.number_integer >= std::numeric_limits<int16_t>::min() and j.m_value.number_integer <= std::numeric_limits<int16_t>::max())
6725 add_to_vector(v, 2, j.m_value.number_integer);
6727 else if (j.m_value.number_integer >= std::numeric_limits<int32_t>::min() and j.m_value.number_integer <= std::numeric_limits<int32_t>::max())
6731 add_to_vector(v, 4, j.m_value.number_integer);
6733 else if (j.m_value.number_integer >= std::numeric_limits<int64_t>::min() and j.m_value.number_integer <= std::numeric_limits<int64_t>::max())
6737 add_to_vector(v, 8, j.m_value.number_integer);
6743 case value_t::number_unsigned:
6745 if (j.m_value.number_unsigned < 128)
6748 add_to_vector(v, 1, j.m_value.number_unsigned);
6750 else if (j.m_value.number_unsigned <= std::numeric_limits<uint8_t>::max())
6754 add_to_vector(v, 1, j.m_value.number_unsigned);
6756 else if (j.m_value.number_unsigned <= std::numeric_limits<uint16_t>::max())
6760 add_to_vector(v, 2, j.m_value.number_unsigned);
6762 else if (j.m_value.number_unsigned <= std::numeric_limits<uint32_t>::max())
6766 add_to_vector(v, 4, j.m_value.number_unsigned);
6768 else if (j.m_value.number_unsigned <= std::numeric_limits<uint64_t>::max())
6772 add_to_vector(v, 8, j.m_value.number_unsigned);
6777 case value_t::number_float:
6781 const auto* helper = reinterpret_cast<const uint8_t*>(&(j.m_value.number_float));
6782 for (size_t i = 0; i < 8; ++i)
6784 v.push_back(helper[7 - i]);
6789 case value_t::string:
6791 const auto N = j.m_value.string->size();
6795 v.push_back(static_cast<uint8_t>(0xa0 | N));
6801 add_to_vector(v, 1, N);
6803 else if (N <= 65535)
6807 add_to_vector(v, 2, N);
6809 else if (N <= 4294967295)
6813 add_to_vector(v, 4, N);
6817 std::copy(j.m_value.string->begin(), j.m_value.string->end(),
6818 std::back_inserter(v));
6822 case value_t::array:
6824 const auto N = j.m_value.array->size();
6828 v.push_back(static_cast<uint8_t>(0x90 | N));
6830 else if (N <= 0xffff)
6834 add_to_vector(v, 2, N);
6836 else if (N <= 0xffffffff)
6840 add_to_vector(v, 4, N);
6843 // append each element
6844 for (const auto& el : *j.m_value.array)
6846 to_msgpack_internal(el, v);
6851 case value_t::object:
6853 const auto N = j.m_value.object->size();
6857 v.push_back(static_cast<uint8_t>(0x80 | (N & 0xf)));
6859 else if (N <= 65535)
6863 add_to_vector(v, 2, N);
6865 else if (N <= 4294967295)
6869 add_to_vector(v, 4, N);
6872 // append each element
6873 for (const auto& el : *j.m_value.object)
6875 to_msgpack_internal(el.first, v);
6876 to_msgpack_internal(el.second, v);
6889 @brief create a CBOR serialization of a given JSON value
6891 This is a straightforward implementation of the CBOR specification.
6893 @param[in] j JSON value to serialize
6894 @param[in,out] v byte vector to write the serialization to
6896 @sa https://tools.ietf.org/html/rfc7049
6898 static void to_cbor_internal(const basic_json& j, std::vector<uint8_t>& v)
6908 case value_t::boolean:
6910 v.push_back(j.m_value.boolean ? 0xf5 : 0xf4);
6914 case value_t::number_integer:
6916 if (j.m_value.number_integer >= 0)
6918 // CBOR does not differentiate between positive signed
6919 // integers and unsigned integers. Therefore, we used the
6920 // code from the value_t::number_unsigned case here.
6921 if (j.m_value.number_integer <= 0x17)
6923 add_to_vector(v, 1, j.m_value.number_integer);
6925 else if (j.m_value.number_integer <= std::numeric_limits<uint8_t>::max())
6929 add_to_vector(v, 1, j.m_value.number_integer);
6931 else if (j.m_value.number_integer <= std::numeric_limits<uint16_t>::max())
6934 // two-byte uint16_t
6935 add_to_vector(v, 2, j.m_value.number_integer);
6937 else if (j.m_value.number_integer <= std::numeric_limits<uint32_t>::max())
6940 // four-byte uint32_t
6941 add_to_vector(v, 4, j.m_value.number_integer);
6946 // eight-byte uint64_t
6947 add_to_vector(v, 8, j.m_value.number_integer);
6952 // The conversions below encode the sign in the first
6953 // byte, and the value is converted to a positive number.
6954 const auto positive_number = -1 - j.m_value.number_integer;
6955 if (j.m_value.number_integer >= -24)
6957 v.push_back(static_cast<uint8_t>(0x20 + positive_number));
6959 else if (positive_number <= std::numeric_limits<uint8_t>::max())
6963 add_to_vector(v, 1, positive_number);
6965 else if (positive_number <= std::numeric_limits<uint16_t>::max())
6969 add_to_vector(v, 2, positive_number);
6971 else if (positive_number <= std::numeric_limits<uint32_t>::max())
6975 add_to_vector(v, 4, positive_number);
6981 add_to_vector(v, 8, positive_number);
6987 case value_t::number_unsigned:
6989 if (j.m_value.number_unsigned <= 0x17)
6991 v.push_back(static_cast<uint8_t>(j.m_value.number_unsigned));
6993 else if (j.m_value.number_unsigned <= 0xff)
6997 add_to_vector(v, 1, j.m_value.number_unsigned);
6999 else if (j.m_value.number_unsigned <= 0xffff)
7002 // two-byte uint16_t
7003 add_to_vector(v, 2, j.m_value.number_unsigned);
7005 else if (j.m_value.number_unsigned <= 0xffffffff)
7008 // four-byte uint32_t
7009 add_to_vector(v, 4, j.m_value.number_unsigned);
7011 else if (j.m_value.number_unsigned <= 0xffffffffffffffff)
7014 // eight-byte uint64_t
7015 add_to_vector(v, 8, j.m_value.number_unsigned);
7020 case value_t::number_float:
7022 // Double-Precision Float
7024 const auto* helper = reinterpret_cast<const uint8_t*>(&(j.m_value.number_float));
7025 for (size_t i = 0; i < 8; ++i)
7027 v.push_back(helper[7 - i]);
7032 case value_t::string:
7034 const auto N = j.m_value.string->size();
7037 v.push_back(0x60 + static_cast<uint8_t>(N)); // 1 byte for string + size
7041 v.push_back(0x78); // one-byte uint8_t for N
7042 add_to_vector(v, 1, N);
7044 else if (N <= 0xffff)
7046 v.push_back(0x79); // two-byte uint16_t for N
7047 add_to_vector(v, 2, N);
7049 else if (N <= 0xffffffff)
7051 v.push_back(0x7a); // four-byte uint32_t for N
7052 add_to_vector(v, 4, N);
7055 else if (N <= 0xffffffffffffffff)
7057 v.push_back(0x7b); // eight-byte uint64_t for N
7058 add_to_vector(v, 8, N);
7063 std::copy(j.m_value.string->begin(), j.m_value.string->end(),
7064 std::back_inserter(v));
7068 case value_t::array:
7070 const auto N = j.m_value.array->size();
7073 v.push_back(0x80 + static_cast<uint8_t>(N)); // 1 byte for array + size
7077 v.push_back(0x98); // one-byte uint8_t for N
7078 add_to_vector(v, 1, N);
7080 else if (N <= 0xffff)
7082 v.push_back(0x99); // two-byte uint16_t for N
7083 add_to_vector(v, 2, N);
7085 else if (N <= 0xffffffff)
7087 v.push_back(0x9a); // four-byte uint32_t for N
7088 add_to_vector(v, 4, N);
7091 else if (N <= 0xffffffffffffffff)
7093 v.push_back(0x9b); // eight-byte uint64_t for N
7094 add_to_vector(v, 8, N);
7098 // append each element
7099 for (const auto& el : *j.m_value.array)
7101 to_cbor_internal(el, v);
7106 case value_t::object:
7108 const auto N = j.m_value.object->size();
7111 v.push_back(0xa0 + static_cast<uint8_t>(N)); // 1 byte for object + size
7116 add_to_vector(v, 1, N); // one-byte uint8_t for N
7118 else if (N <= 0xffff)
7121 add_to_vector(v, 2, N); // two-byte uint16_t for N
7123 else if (N <= 0xffffffff)
7126 add_to_vector(v, 4, N); // four-byte uint32_t for N
7129 else if (N <= 0xffffffffffffffff)
7132 add_to_vector(v, 8, N); // eight-byte uint64_t for N
7136 // append each element
7137 for (const auto& el : *j.m_value.object)
7139 to_cbor_internal(el.first, v);
7140 to_cbor_internal(el.second, v);
7154 @brief checks if given lengths do not exceed the size of a given vector
7156 To secure the access to the byte vector during CBOR/MessagePack
7157 deserialization, bytes are copied from the vector into buffers. This
7158 function checks if the number of bytes to copy (@a len) does not exceed
7159 the size @s size of the vector. Additionally, an @a offset is given from
7160 where to start reading the bytes.
7162 This function checks whether reading the bytes is safe; that is, offset is
7163 a valid index in the vector, offset+len
7165 @param[in] size size of the byte vector
7166 @param[in] len number of bytes to read
7167 @param[in] offset offset where to start reading
7169 vec: x x x x x X X X X X
7173 @throws out_of_range if `len > v.size()`
7175 static void check_length(const size_t size, const size_t len, const size_t offset)
7177 // simple case: requested length is greater than the vector's length
7178 if (len > size or offset > size)
7180 JSON_THROW(std::out_of_range("len out of range"));
7183 // second case: adding offset would result in overflow
7184 if ((size > (std::numeric_limits<size_t>::max() - offset)))
7186 JSON_THROW(std::out_of_range("len+offset out of range"));
7189 // last case: reading past the end of the vector
7190 if (len + offset > size)
7192 JSON_THROW(std::out_of_range("len+offset out of range"));
7197 @brief create a JSON value from a given MessagePack vector
7199 @param[in] v MessagePack serialization
7200 @param[in] idx byte index to start reading from @a v
7202 @return deserialized JSON value
7204 @throw std::invalid_argument if unsupported features from MessagePack were
7205 used in the given vector @a v or if the input is not valid MessagePack
7206 @throw std::out_of_range if the given vector ends prematurely
7208 @sa https://github.com/msgpack/msgpack/blob/master/spec.md
7210 static basic_json from_msgpack_internal(const std::vector<uint8_t>& v, size_t& idx)
7212 // make sure reading 1 byte is safe
7213 check_length(v.size(), 1, idx);
7215 // store and increment index
7216 const size_t current_idx = idx++;
7218 if (v[current_idx] <= 0xbf)
7220 if (v[current_idx] <= 0x7f) // positive fixint
7222 return v[current_idx];
7224 if (v[current_idx] <= 0x8f) // fixmap
7226 basic_json result = value_t::object;
7227 const size_t len = v[current_idx] & 0x0f;
7228 for (size_t i = 0; i < len; ++i)
7230 std::string key = from_msgpack_internal(v, idx);
7231 result[key] = from_msgpack_internal(v, idx);
7235 else if (v[current_idx] <= 0x9f) // fixarray
7237 basic_json result = value_t::array;
7238 const size_t len = v[current_idx] & 0x0f;
7239 for (size_t i = 0; i < len; ++i)
7241 result.push_back(from_msgpack_internal(v, idx));
7247 const size_t len = v[current_idx] & 0x1f;
7248 const size_t offset = current_idx + 1;
7249 idx += len; // skip content bytes
7250 check_length(v.size(), len, offset);
7251 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7254 else if (v[current_idx] >= 0xe0) // negative fixint
7256 return static_cast<int8_t>(v[current_idx]);
7260 switch (v[current_idx])
7264 return value_t::null;
7277 case 0xca: // float 32
7279 // copy bytes in reverse order into the double variable
7281 for (size_t byte = 0; byte < sizeof(float); ++byte)
7283 reinterpret_cast<uint8_t*>(&res)[sizeof(float) - byte - 1] = v.at(current_idx + 1 + byte);
7285 idx += sizeof(float); // skip content bytes
7289 case 0xcb: // float 64
7291 // copy bytes in reverse order into the double variable
7293 for (size_t byte = 0; byte < sizeof(double); ++byte)
7295 reinterpret_cast<uint8_t*>(&res)[sizeof(double) - byte - 1] = v.at(current_idx + 1 + byte);
7297 idx += sizeof(double); // skip content bytes
7301 case 0xcc: // uint 8
7303 idx += 1; // skip content byte
7304 return get_from_vector<uint8_t>(v, current_idx);
7307 case 0xcd: // uint 16
7309 idx += 2; // skip 2 content bytes
7310 return get_from_vector<uint16_t>(v, current_idx);
7313 case 0xce: // uint 32
7315 idx += 4; // skip 4 content bytes
7316 return get_from_vector<uint32_t>(v, current_idx);
7319 case 0xcf: // uint 64
7321 idx += 8; // skip 8 content bytes
7322 return get_from_vector<uint64_t>(v, current_idx);
7327 idx += 1; // skip content byte
7328 return get_from_vector<int8_t>(v, current_idx);
7331 case 0xd1: // int 16
7333 idx += 2; // skip 2 content bytes
7334 return get_from_vector<int16_t>(v, current_idx);
7337 case 0xd2: // int 32
7339 idx += 4; // skip 4 content bytes
7340 return get_from_vector<int32_t>(v, current_idx);
7343 case 0xd3: // int 64
7345 idx += 8; // skip 8 content bytes
7346 return get_from_vector<int64_t>(v, current_idx);
7351 const auto len = static_cast<size_t>(get_from_vector<uint8_t>(v, current_idx));
7352 const size_t offset = current_idx + 2;
7353 idx += len + 1; // skip size byte + content bytes
7354 check_length(v.size(), len, offset);
7355 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7358 case 0xda: // str 16
7360 const auto len = static_cast<size_t>(get_from_vector<uint16_t>(v, current_idx));
7361 const size_t offset = current_idx + 3;
7362 idx += len + 2; // skip 2 size bytes + content bytes
7363 check_length(v.size(), len, offset);
7364 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7367 case 0xdb: // str 32
7369 const auto len = static_cast<size_t>(get_from_vector<uint32_t>(v, current_idx));
7370 const size_t offset = current_idx + 5;
7371 idx += len + 4; // skip 4 size bytes + content bytes
7372 check_length(v.size(), len, offset);
7373 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7376 case 0xdc: // array 16
7378 basic_json result = value_t::array;
7379 const auto len = static_cast<size_t>(get_from_vector<uint16_t>(v, current_idx));
7380 idx += 2; // skip 2 size bytes
7381 for (size_t i = 0; i < len; ++i)
7383 result.push_back(from_msgpack_internal(v, idx));
7388 case 0xdd: // array 32
7390 basic_json result = value_t::array;
7391 const auto len = static_cast<size_t>(get_from_vector<uint32_t>(v, current_idx));
7392 idx += 4; // skip 4 size bytes
7393 for (size_t i = 0; i < len; ++i)
7395 result.push_back(from_msgpack_internal(v, idx));
7400 case 0xde: // map 16
7402 basic_json result = value_t::object;
7403 const auto len = static_cast<size_t>(get_from_vector<uint16_t>(v, current_idx));
7404 idx += 2; // skip 2 size bytes
7405 for (size_t i = 0; i < len; ++i)
7407 std::string key = from_msgpack_internal(v, idx);
7408 result[key] = from_msgpack_internal(v, idx);
7413 case 0xdf: // map 32
7415 basic_json result = value_t::object;
7416 const auto len = static_cast<size_t>(get_from_vector<uint32_t>(v, current_idx));
7417 idx += 4; // skip 4 size bytes
7418 for (size_t i = 0; i < len; ++i)
7420 std::string key = from_msgpack_internal(v, idx);
7421 result[key] = from_msgpack_internal(v, idx);
7428 JSON_THROW(std::invalid_argument("error parsing a msgpack @ " + std::to_string(current_idx) + ": " + std::to_string(static_cast<int>(v[current_idx]))));
7435 @brief create a JSON value from a given CBOR vector
7437 @param[in] v CBOR serialization
7438 @param[in] idx byte index to start reading from @a v
7440 @return deserialized JSON value
7442 @throw std::invalid_argument if unsupported features from CBOR were used in
7443 the given vector @a v or if the input is not valid CBOR
7444 @throw std::out_of_range if the given vector ends prematurely
7446 @sa https://tools.ietf.org/html/rfc7049
7448 static basic_json from_cbor_internal(const std::vector<uint8_t>& v, size_t& idx)
7450 // store and increment index
7451 const size_t current_idx = idx++;
7453 switch (v.at(current_idx))
7455 // Integer 0x00..0x17 (0..23)
7481 return v[current_idx];
7484 case 0x18: // Unsigned integer (one-byte uint8_t follows)
7486 idx += 1; // skip content byte
7487 return get_from_vector<uint8_t>(v, current_idx);
7490 case 0x19: // Unsigned integer (two-byte uint16_t follows)
7492 idx += 2; // skip 2 content bytes
7493 return get_from_vector<uint16_t>(v, current_idx);
7496 case 0x1a: // Unsigned integer (four-byte uint32_t follows)
7498 idx += 4; // skip 4 content bytes
7499 return get_from_vector<uint32_t>(v, current_idx);
7502 case 0x1b: // Unsigned integer (eight-byte uint64_t follows)
7504 idx += 8; // skip 8 content bytes
7505 return get_from_vector<uint64_t>(v, current_idx);
7508 // Negative integer -1-0x00..-1-0x17 (-1..-24)
7534 return static_cast<int8_t>(0x20 - 1 - v[current_idx]);
7537 case 0x38: // Negative integer (one-byte uint8_t follows)
7539 idx += 1; // skip content byte
7540 // must be uint8_t !
7541 return static_cast<number_integer_t>(-1) - get_from_vector<uint8_t>(v, current_idx);
7544 case 0x39: // Negative integer -1-n (two-byte uint16_t follows)
7546 idx += 2; // skip 2 content bytes
7547 return static_cast<number_integer_t>(-1) - get_from_vector<uint16_t>(v, current_idx);
7550 case 0x3a: // Negative integer -1-n (four-byte uint32_t follows)
7552 idx += 4; // skip 4 content bytes
7553 return static_cast<number_integer_t>(-1) - get_from_vector<uint32_t>(v, current_idx);
7556 case 0x3b: // Negative integer -1-n (eight-byte uint64_t follows)
7558 idx += 8; // skip 8 content bytes
7559 return static_cast<number_integer_t>(-1) - static_cast<number_integer_t>(get_from_vector<uint64_t>(v, current_idx));
7562 // UTF-8 string (0x00..0x17 bytes follow)
7588 const auto len = static_cast<size_t>(v[current_idx] - 0x60);
7589 const size_t offset = current_idx + 1;
7590 idx += len; // skip content bytes
7591 check_length(v.size(), len, offset);
7592 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7595 case 0x78: // UTF-8 string (one-byte uint8_t for n follows)
7597 const auto len = static_cast<size_t>(get_from_vector<uint8_t>(v, current_idx));
7598 const size_t offset = current_idx + 2;
7599 idx += len + 1; // skip size byte + content bytes
7600 check_length(v.size(), len, offset);
7601 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7604 case 0x79: // UTF-8 string (two-byte uint16_t for n follow)
7606 const auto len = static_cast<size_t>(get_from_vector<uint16_t>(v, current_idx));
7607 const size_t offset = current_idx + 3;
7608 idx += len + 2; // skip 2 size bytes + content bytes
7609 check_length(v.size(), len, offset);
7610 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7613 case 0x7a: // UTF-8 string (four-byte uint32_t for n follow)
7615 const auto len = static_cast<size_t>(get_from_vector<uint32_t>(v, current_idx));
7616 const size_t offset = current_idx + 5;
7617 idx += len + 4; // skip 4 size bytes + content bytes
7618 check_length(v.size(), len, offset);
7619 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7622 case 0x7b: // UTF-8 string (eight-byte uint64_t for n follow)
7624 const auto len = static_cast<size_t>(get_from_vector<uint64_t>(v, current_idx));
7625 const size_t offset = current_idx + 9;
7626 idx += len + 8; // skip 8 size bytes + content bytes
7627 check_length(v.size(), len, offset);
7628 return std::string(reinterpret_cast<const char*>(v.data()) + offset, len);
7631 case 0x7f: // UTF-8 string (indefinite length)
7634 while (v.at(idx) != 0xff)
7636 string_t s = from_cbor_internal(v, idx);
7639 // skip break byte (0xFF)
7644 // array (0x00..0x17 data items follow)
7670 basic_json result = value_t::array;
7671 const auto len = static_cast<size_t>(v[current_idx] - 0x80);
7672 for (size_t i = 0; i < len; ++i)
7674 result.push_back(from_cbor_internal(v, idx));
7679 case 0x98: // array (one-byte uint8_t for n follows)
7681 basic_json result = value_t::array;
7682 const auto len = static_cast<size_t>(get_from_vector<uint8_t>(v, current_idx));
7683 idx += 1; // skip 1 size byte
7684 for (size_t i = 0; i < len; ++i)
7686 result.push_back(from_cbor_internal(v, idx));
7691 case 0x99: // array (two-byte uint16_t for n follow)
7693 basic_json result = value_t::array;
7694 const auto len = static_cast<size_t>(get_from_vector<uint16_t>(v, current_idx));
7695 idx += 2; // skip 4 size bytes
7696 for (size_t i = 0; i < len; ++i)
7698 result.push_back(from_cbor_internal(v, idx));
7703 case 0x9a: // array (four-byte uint32_t for n follow)
7705 basic_json result = value_t::array;
7706 const auto len = static_cast<size_t>(get_from_vector<uint32_t>(v, current_idx));
7707 idx += 4; // skip 4 size bytes
7708 for (size_t i = 0; i < len; ++i)
7710 result.push_back(from_cbor_internal(v, idx));
7715 case 0x9b: // array (eight-byte uint64_t for n follow)
7717 basic_json result = value_t::array;
7718 const auto len = static_cast<size_t>(get_from_vector<uint64_t>(v, current_idx));
7719 idx += 8; // skip 8 size bytes
7720 for (size_t i = 0; i < len; ++i)
7722 result.push_back(from_cbor_internal(v, idx));
7727 case 0x9f: // array (indefinite length)
7729 basic_json result = value_t::array;
7730 while (v.at(idx) != 0xff)
7732 result.push_back(from_cbor_internal(v, idx));
7734 // skip break byte (0xFF)
7739 // map (0x00..0x17 pairs of data items follow)
7765 basic_json result = value_t::object;
7766 const auto len = static_cast<size_t>(v[current_idx] - 0xa0);
7767 for (size_t i = 0; i < len; ++i)
7769 std::string key = from_cbor_internal(v, idx);
7770 result[key] = from_cbor_internal(v, idx);
7775 case 0xb8: // map (one-byte uint8_t for n follows)
7777 basic_json result = value_t::object;
7778 const auto len = static_cast<size_t>(get_from_vector<uint8_t>(v, current_idx));
7779 idx += 1; // skip 1 size byte
7780 for (size_t i = 0; i < len; ++i)
7782 std::string key = from_cbor_internal(v, idx);
7783 result[key] = from_cbor_internal(v, idx);
7788 case 0xb9: // map (two-byte uint16_t for n follow)
7790 basic_json result = value_t::object;
7791 const auto len = static_cast<size_t>(get_from_vector<uint16_t>(v, current_idx));
7792 idx += 2; // skip 2 size bytes
7793 for (size_t i = 0; i < len; ++i)
7795 std::string key = from_cbor_internal(v, idx);
7796 result[key] = from_cbor_internal(v, idx);
7801 case 0xba: // map (four-byte uint32_t for n follow)
7803 basic_json result = value_t::object;
7804 const auto len = static_cast<size_t>(get_from_vector<uint32_t>(v, current_idx));
7805 idx += 4; // skip 4 size bytes
7806 for (size_t i = 0; i < len; ++i)
7808 std::string key = from_cbor_internal(v, idx);
7809 result[key] = from_cbor_internal(v, idx);
7814 case 0xbb: // map (eight-byte uint64_t for n follow)
7816 basic_json result = value_t::object;
7817 const auto len = static_cast<size_t>(get_from_vector<uint64_t>(v, current_idx));
7818 idx += 8; // skip 8 size bytes
7819 for (size_t i = 0; i < len; ++i)
7821 std::string key = from_cbor_internal(v, idx);
7822 result[key] = from_cbor_internal(v, idx);
7827 case 0xbf: // map (indefinite length)
7829 basic_json result = value_t::object;
7830 while (v.at(idx) != 0xff)
7832 std::string key = from_cbor_internal(v, idx);
7833 result[key] = from_cbor_internal(v, idx);
7835 // skip break byte (0xFF)
7852 return value_t::null;
7855 case 0xf9: // Half-Precision Float (two-byte IEEE 754)
7857 idx += 2; // skip two content bytes
7859 // code from RFC 7049, Appendix D, Figure 3:
7860 // As half-precision floating-point numbers were only added to
7861 // IEEE 754 in 2008, today's programming platforms often still
7862 // only have limited support for them. It is very easy to
7863 // include at least decoding support for them even without such
7864 // support. An example of a small decoder for half-precision
7865 // floating-point numbers in the C language is shown in Fig. 3.
7866 const int half = (v.at(current_idx + 1) << 8) + v.at(current_idx + 2);
7867 const int exp = (half >> 10) & 0x1f;
7868 const int mant = half & 0x3ff;
7872 val = std::ldexp(mant, -24);
7876 val = std::ldexp(mant + 1024, exp - 25);
7881 ? std::numeric_limits<double>::infinity()
7882 : std::numeric_limits<double>::quiet_NaN();
7884 return (half & 0x8000) != 0 ? -val : val;
7887 case 0xfa: // Single-Precision Float (four-byte IEEE 754)
7889 // copy bytes in reverse order into the float variable
7891 for (size_t byte = 0; byte < sizeof(float); ++byte)
7893 reinterpret_cast<uint8_t*>(&res)[sizeof(float) - byte - 1] = v.at(current_idx + 1 + byte);
7895 idx += sizeof(float); // skip content bytes
7899 case 0xfb: // Double-Precision Float (eight-byte IEEE 754)
7901 // copy bytes in reverse order into the double variable
7903 for (size_t byte = 0; byte < sizeof(double); ++byte)
7905 reinterpret_cast<uint8_t*>(&res)[sizeof(double) - byte - 1] = v.at(current_idx + 1 + byte);
7907 idx += sizeof(double); // skip content bytes
7911 default: // anything else (0xFF is handled inside the other types)
7913 JSON_THROW(std::invalid_argument("error parsing a CBOR @ " + std::to_string(current_idx) + ": " + std::to_string(static_cast<int>(v[current_idx]))));
7920 @brief create a MessagePack serialization of a given JSON value
7922 Serializes a given JSON value @a j to a byte vector using the MessagePack
7923 serialization format. MessagePack is a binary serialization format which
7924 aims to be more compact than JSON itself, yet more efficient to parse.
7926 @param[in] j JSON value to serialize
7927 @return MessagePack serialization as byte vector
7929 @complexity Linear in the size of the JSON value @a j.
7931 @liveexample{The example shows the serialization of a JSON value to a byte
7932 vector in MessagePack format.,to_msgpack}
7934 @sa http://msgpack.org
7935 @sa @ref from_msgpack(const std::vector<uint8_t>&, const size_t) for the
7936 analogous deserialization
7937 @sa @ref to_cbor(const basic_json& for the related CBOR format
7939 @since version 2.0.9
7941 static std::vector<uint8_t> to_msgpack(const basic_json& j)
7943 std::vector<uint8_t> result;
7944 to_msgpack_internal(j, result);
7949 @brief create a JSON value from a byte vector in MessagePack format
7951 Deserializes a given byte vector @a v to a JSON value using the MessagePack
7952 serialization format.
7954 @param[in] v a byte vector in MessagePack format
7955 @param[in] start_index the index to start reading from @a v (0 by default)
7956 @return deserialized JSON value
7958 @throw std::invalid_argument if unsupported features from MessagePack were
7959 used in the given vector @a v or if the input is not valid MessagePack
7960 @throw std::out_of_range if the given vector ends prematurely
7962 @complexity Linear in the size of the byte vector @a v.
7964 @liveexample{The example shows the deserialization of a byte vector in
7965 MessagePack format to a JSON value.,from_msgpack}
7967 @sa http://msgpack.org
7968 @sa @ref to_msgpack(const basic_json&) for the analogous serialization
7969 @sa @ref from_cbor(const std::vector<uint8_t>&, const size_t) for the
7972 @since version 2.0.9, parameter @a start_index since 2.1.1
7974 static basic_json from_msgpack(const std::vector<uint8_t>& v,
7975 const size_t start_index = 0)
7977 size_t i = start_index;
7978 return from_msgpack_internal(v, i);
7982 @brief create a MessagePack serialization of a given JSON value
7984 Serializes a given JSON value @a j to a byte vector using the CBOR (Concise
7985 Binary Object Representation) serialization format. CBOR is a binary
7986 serialization format which aims to be more compact than JSON itself, yet
7987 more efficient to parse.
7989 @param[in] j JSON value to serialize
7990 @return MessagePack serialization as byte vector
7992 @complexity Linear in the size of the JSON value @a j.
7994 @liveexample{The example shows the serialization of a JSON value to a byte
7995 vector in CBOR format.,to_cbor}
7998 @sa @ref from_cbor(const std::vector<uint8_t>&, const size_t) for the
7999 analogous deserialization
8000 @sa @ref to_msgpack(const basic_json& for the related MessagePack format
8002 @since version 2.0.9
8004 static std::vector<uint8_t> to_cbor(const basic_json& j)
8006 std::vector<uint8_t> result;
8007 to_cbor_internal(j, result);
8012 @brief create a JSON value from a byte vector in CBOR format
8014 Deserializes a given byte vector @a v to a JSON value using the CBOR
8015 (Concise Binary Object Representation) serialization format.
8017 @param[in] v a byte vector in CBOR format
8018 @param[in] start_index the index to start reading from @a v (0 by default)
8019 @return deserialized JSON value
8021 @throw std::invalid_argument if unsupported features from CBOR were used in
8022 the given vector @a v or if the input is not valid MessagePack
8023 @throw std::out_of_range if the given vector ends prematurely
8025 @complexity Linear in the size of the byte vector @a v.
8027 @liveexample{The example shows the deserialization of a byte vector in CBOR
8028 format to a JSON value.,from_cbor}
8031 @sa @ref to_cbor(const basic_json&) for the analogous serialization
8032 @sa @ref from_msgpack(const std::vector<uint8_t>&, const size_t) for the
8033 related MessagePack format
8035 @since version 2.0.9, parameter @a start_index since 2.1.1
8037 static basic_json from_cbor(const std::vector<uint8_t>& v,
8038 const size_t start_index = 0)
8040 size_t i = start_index;
8041 return from_cbor_internal(v, i);
8046 ///////////////////////////
8047 // convenience functions //
8048 ///////////////////////////
8051 @brief return the type as string
8053 Returns the type name as string to be used in error messages - usually to
8054 indicate that a function was called on a wrong JSON type.
8056 @return basically a string representation of a the @a m_type member
8058 @complexity Constant.
8060 @liveexample{The following code exemplifies `type_name()` for all JSON
8063 @since version 1.0.0, public since 2.1.0
8065 std::string type_name() const
8072 case value_t::object:
8074 case value_t::array:
8076 case value_t::string:
8078 case value_t::boolean:
8080 case value_t::discarded:
8090 @brief calculates the extra space to escape a JSON string
8092 @param[in] s the string to escape
8093 @return the number of characters required to escape string @a s
8095 @complexity Linear in the length of string @a s.
8097 static std::size_t extra_space(const string_t& s) noexcept
8099 return std::accumulate(s.begin(), s.end(), size_t{},
8100 [](size_t res, typename string_t::value_type c)
8112 // from c (1 byte) to \x (2 bytes)
8118 if (c >= 0x00 and c <= 0x1f)
8120 // from c (1 byte) to \uxxxx (6 bytes)
8131 @brief escape a string
8133 Escape a string by replacing certain special characters by a sequence of
8134 an escape character (backslash) and another character and other control
8135 characters by a sequence of "\u" followed by a four-digit hex
8138 @param[in] s the string to escape
8139 @return the escaped string
8141 @complexity Linear in the length of string @a s.
8143 static string_t escape_string(const string_t& s)
8145 const auto space = extra_space(s);
8151 // create a result string of necessary size
8152 string_t result(s.size() + space, '\\');
8153 std::size_t pos = 0;
8155 for (const auto& c : s)
8159 // quotation mark (0x22)
8162 result[pos + 1] = '"';
8167 // reverse solidus (0x5c)
8170 // nothing to change
8178 result[pos + 1] = 'b';
8186 result[pos + 1] = 'f';
8194 result[pos + 1] = 'n';
8199 // carriage return (0x0d)
8202 result[pos + 1] = 'r';
8207 // horizontal tab (0x09)
8210 result[pos + 1] = 't';
8217 if (c >= 0x00 and c <= 0x1f)
8219 // convert a number 0..15 to its hex representation
8221 static const char hexify[16] =
8223 '0', '1', '2', '3', '4', '5', '6', '7',
8224 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
8227 // print character c as \uxxxx
8229 { 'u', '0', '0', hexify[c >> 4], hexify[c & 0x0f]
8239 // all other characters are added as-is
8252 @brief locale-independent serialization for built-in arithmetic types
8257 template<typename NumberType>
8258 numtostr(NumberType value)
8260 x_write(value, std::is_integral<NumberType>());
8263 const char* c_str() const
8265 return m_buf.data();
8269 /// a (hopefully) large enough character buffer
8270 std::array < char, 64 > m_buf{{}};
8272 template<typename NumberType>
8273 void x_write(NumberType x, /*is_integral=*/std::true_type)
8275 // special case for "0"
8282 const bool is_negative = x < 0;
8285 // spare 1 byte for '\0'
8286 while (x != 0 and i < m_buf.size() - 1)
8288 const auto digit = std::labs(static_cast<long>(x % 10));
8289 m_buf[i++] = static_cast<char>('0' + digit);
8293 // make sure the number has been processed completely
8298 // make sure there is capacity for the '-'
8299 assert(i < m_buf.size() - 2);
8303 std::reverse(m_buf.begin(), m_buf.begin() + i);
8306 template<typename NumberType>
8307 void x_write(NumberType x, /*is_integral=*/std::false_type)
8309 // special case for 0.0 and -0.0
8313 if (std::signbit(x))
8323 // get number of digits for a text -> float -> text round-trip
8324 static constexpr auto d = std::numeric_limits<NumberType>::digits10;
8326 // the actual conversion
8327 const auto written_bytes = snprintf(m_buf.data(), m_buf.size(), "%.*g", d, x);
8329 // negative value indicates an error
8330 assert(written_bytes > 0);
8331 // check if buffer was large enough
8332 assert(static_cast<size_t>(written_bytes) < m_buf.size());
8334 // read information from locale
8335 const auto loc = localeconv();
8336 assert(loc != nullptr);
8337 const char thousands_sep = !loc->thousands_sep ? '\0'
8338 : loc->thousands_sep[0];
8340 const char decimal_point = !loc->decimal_point ? '\0'
8341 : loc->decimal_point[0];
8343 // erase thousands separator
8344 if (thousands_sep != '\0')
8346 const auto end = std::remove(m_buf.begin(), m_buf.begin() + written_bytes, thousands_sep);
8347 std::fill(end, m_buf.end(), '\0');
8350 // convert decimal point to '.'
8351 if (decimal_point != '\0' and decimal_point != '.')
8353 for (auto& c : m_buf)
8355 if (c == decimal_point)
8363 // determine if need to append ".0"
8365 bool value_is_int_like = true;
8366 for (i = 0; i < m_buf.size(); ++i)
8368 // break when end of number is reached
8369 if (m_buf[i] == '\0')
8374 // check if we find non-int character
8375 value_is_int_like = value_is_int_like and m_buf[i] != '.' and
8376 m_buf[i] != 'e' and m_buf[i] != 'E';
8379 if (value_is_int_like)
8381 // there must be 2 bytes left for ".0"
8382 assert((i + 2) < m_buf.size());
8383 // we write to the end of the number
8384 assert(m_buf[i] == '\0');
8385 assert(m_buf[i - 1] != '\0');
8391 // the resulting string is properly terminated
8392 assert(m_buf[i + 2] == '\0');
8399 @brief internal implementation of the serialization function
8401 This function is called by the public member function dump and organizes
8402 the serialization internally. The indentation level is propagated as
8403 additional parameter. In case of arrays and objects, the function is
8404 called recursively. Note that
8406 - strings and object keys are escaped using `escape_string()`
8407 - integer numbers are converted implicitly via `operator<<`
8408 - floating-point numbers are converted to a string using `"%g"` format
8410 @param[out] o stream to write to
8411 @param[in] pretty_print whether the output shall be pretty-printed
8412 @param[in] indent_step the indent level
8413 @param[in] current_indent the current indent level (only used internally)
8415 void dump(std::ostream& o,
8416 const bool pretty_print,
8417 const unsigned int indent_step,
8418 const unsigned int current_indent = 0) const
8420 // variable to hold indentation for recursive calls
8421 unsigned int new_indent = current_indent;
8425 case value_t::object:
8427 if (m_value.object->empty())
8435 // increase indentation
8438 new_indent += indent_step;
8442 for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i)
8444 if (i != m_value.object->cbegin())
8446 o << (pretty_print ? ",\n" : ",");
8448 o << string_t(new_indent, ' ') << "\""
8449 << escape_string(i->first) << "\":"
8450 << (pretty_print ? " " : "");
8451 i->second.dump(o, pretty_print, indent_step, new_indent);
8454 // decrease indentation
8457 new_indent -= indent_step;
8461 o << string_t(new_indent, ' ') + "}";
8465 case value_t::array:
8467 if (m_value.array->empty())
8475 // increase indentation
8478 new_indent += indent_step;
8482 for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i)
8484 if (i != m_value.array->cbegin())
8486 o << (pretty_print ? ",\n" : ",");
8488 o << string_t(new_indent, ' ');
8489 i->dump(o, pretty_print, indent_step, new_indent);
8492 // decrease indentation
8495 new_indent -= indent_step;
8499 o << string_t(new_indent, ' ') << "]";
8503 case value_t::string:
8505 o << string_t("\"") << escape_string(*m_value.string) << "\"";
8509 case value_t::boolean:
8511 o << (m_value.boolean ? "true" : "false");
8515 case value_t::number_integer:
8517 o << numtostr(m_value.number_integer).c_str();
8521 case value_t::number_unsigned:
8523 o << numtostr(m_value.number_unsigned).c_str();
8527 case value_t::number_float:
8529 o << numtostr(m_value.number_float).c_str();
8533 case value_t::discarded:
8548 //////////////////////
8549 // member variables //
8550 //////////////////////
8552 /// the type of the current element
8553 value_t m_type = value_t::null;
8555 /// the value of the current element
8556 json_value m_value = {};
8565 @brief an iterator for primitive JSON types
8567 This class models an iterator for primitive JSON types (boolean, number,
8568 string). It's only purpose is to allow the iterator/const_iterator classes
8569 to "iterate" over primitive values. Internally, the iterator is modeled by
8570 a `difference_type` variable. Value begin_value (`0`) models the begin,
8571 end_value (`1`) models past the end.
8573 class primitive_iterator_t
8577 difference_type get_value() const noexcept
8581 /// set iterator to a defined beginning
8582 void set_begin() noexcept
8587 /// set iterator to a defined past the end
8588 void set_end() noexcept
8593 /// return whether the iterator can be dereferenced
8594 constexpr bool is_begin() const noexcept
8596 return (m_it == begin_value);
8599 /// return whether the iterator is at end
8600 constexpr bool is_end() const noexcept
8602 return (m_it == end_value);
8605 friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
8607 return lhs.m_it == rhs.m_it;
8610 friend constexpr bool operator!=(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
8612 return !(lhs == rhs);
8615 friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
8617 return lhs.m_it < rhs.m_it;
8620 friend constexpr bool operator<=(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
8622 return lhs.m_it <= rhs.m_it;
8625 friend constexpr bool operator>(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
8627 return lhs.m_it > rhs.m_it;
8630 friend constexpr bool operator>=(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
8632 return lhs.m_it >= rhs.m_it;
8635 primitive_iterator_t operator+(difference_type i)
8637 auto result = *this;
8642 friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
8644 return lhs.m_it - rhs.m_it;
8647 friend std::ostream& operator<<(std::ostream& os, primitive_iterator_t it)
8649 return os << it.m_it;
8652 primitive_iterator_t& operator++()
8658 primitive_iterator_t operator++(int)
8660 auto result = *this;
8665 primitive_iterator_t& operator--()
8671 primitive_iterator_t operator--(int)
8673 auto result = *this;
8678 primitive_iterator_t& operator+=(difference_type n)
8684 primitive_iterator_t& operator-=(difference_type n)
8691 static constexpr difference_type begin_value = 0;
8692 static constexpr difference_type end_value = begin_value + 1;
8694 /// iterator as signed integer type
8695 difference_type m_it = std::numeric_limits<std::ptrdiff_t>::denorm_min();
8699 @brief an iterator value
8701 @note This structure could easily be a union, but MSVC currently does not
8702 allow unions members with complex constructors, see
8703 https://github.com/nlohmann/json/pull/105.
8705 struct internal_iterator
8707 /// iterator for JSON objects
8708 typename object_t::iterator object_iterator;
8709 /// iterator for JSON arrays
8710 typename array_t::iterator array_iterator;
8711 /// generic iterator for all other types
8712 primitive_iterator_t primitive_iterator;
8714 /// create an uninitialized internal_iterator
8715 internal_iterator() noexcept
8716 : object_iterator(), array_iterator(), primitive_iterator()
8720 /// proxy class for the iterator_wrapper functions
8721 template<typename IteratorType>
8722 class iteration_proxy
8725 /// helper class for iteration
8726 class iteration_proxy_internal
8730 IteratorType anchor;
8731 /// an index for arrays (used to create key names)
8732 size_t array_index = 0;
8735 explicit iteration_proxy_internal(IteratorType it) noexcept
8739 /// dereference operator (needed for range-based for)
8740 iteration_proxy_internal& operator*()
8745 /// increment operator (needed for range-based for)
8746 iteration_proxy_internal& operator++()
8754 /// inequality operator (needed for range-based for)
8755 bool operator!= (const iteration_proxy_internal& o) const
8757 return anchor != o.anchor;
8760 /// return key of the iterator
8761 typename basic_json::string_t key() const
8763 assert(anchor.m_object != nullptr);
8765 switch (anchor.m_object->type())
8767 // use integer array index as key
8768 case value_t::array:
8770 return std::to_string(array_index);
8773 // use key from the object
8774 case value_t::object:
8776 return anchor.key();
8779 // use an empty key for all primitive types
8787 /// return value of the iterator
8788 typename IteratorType::reference value() const
8790 return anchor.value();
8794 /// the container to iterate
8795 typename IteratorType::reference container;
8798 /// construct iteration proxy from a container
8799 explicit iteration_proxy(typename IteratorType::reference cont)
8803 /// return iterator begin (needed for range-based for)
8804 iteration_proxy_internal begin() noexcept
8806 return iteration_proxy_internal(container.begin());
8809 /// return iterator end (needed for range-based for)
8810 iteration_proxy_internal end() noexcept
8812 return iteration_proxy_internal(container.end());
8818 @brief a template for a random access iterator for the @ref basic_json class
8820 This class implements a both iterators (iterator and const_iterator) for the
8821 @ref basic_json class.
8823 @note An iterator is called *initialized* when a pointer to a JSON value
8824 has been set (e.g., by a constructor or a copy assignment). If the
8825 iterator is default-constructed, it is *uninitialized* and most
8826 methods are undefined. **The library uses assertions to detect calls
8827 on uninitialized iterators.**
8829 @requirement The class satisfies the following concept requirements:
8830 - [RandomAccessIterator](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator):
8831 The iterator that can be moved to point (forward and backward) to any
8832 element in constant time.
8834 @since version 1.0.0, simplified in version 2.0.9
8836 template<typename U>
8837 class iter_impl : public std::iterator<std::random_access_iterator_tag, U>
8839 /// allow basic_json to access private members
8840 friend class basic_json;
8842 // make sure U is basic_json or const basic_json
8843 static_assert(std::is_same<U, basic_json>::value
8844 or std::is_same<U, const basic_json>::value,
8845 "iter_impl only accepts (const) basic_json");
8848 /// the type of the values when the iterator is dereferenced
8849 using value_type = typename basic_json::value_type;
8850 /// a type to represent differences between iterators
8851 using difference_type = typename basic_json::difference_type;
8852 /// defines a pointer to the type iterated over (value_type)
8853 using pointer = typename std::conditional<std::is_const<U>::value,
8854 typename basic_json::const_pointer,
8855 typename basic_json::pointer>::type;
8856 /// defines a reference to the type iterated over (value_type)
8857 using reference = typename std::conditional<std::is_const<U>::value,
8858 typename basic_json::const_reference,
8859 typename basic_json::reference>::type;
8860 /// the category of the iterator
8861 using iterator_category = std::bidirectional_iterator_tag;
8863 /// default constructor
8864 iter_impl() = default;
8867 @brief constructor for a given JSON instance
8868 @param[in] object pointer to a JSON object for this iterator
8869 @pre object != nullptr
8870 @post The iterator is initialized; i.e. `m_object != nullptr`.
8872 explicit iter_impl(pointer object) noexcept
8875 assert(m_object != nullptr);
8877 switch (m_object->m_type)
8879 case basic_json::value_t::object:
8881 m_it.object_iterator = typename object_t::iterator();
8885 case basic_json::value_t::array:
8887 m_it.array_iterator = typename array_t::iterator();
8893 m_it.primitive_iterator = primitive_iterator_t();
8900 Use operator `const_iterator` instead of `const_iterator(const iterator&
8901 other) noexcept` to avoid two class definitions for @ref iterator and
8902 @ref const_iterator.
8904 This function is only called if this class is an @ref iterator. If this
8905 class is a @ref const_iterator this function is not called.
8907 operator const_iterator() const
8913 ret.m_object = m_object;
8921 @brief copy constructor
8922 @param[in] other iterator to copy from
8923 @note It is not checked whether @a other is initialized.
8925 iter_impl(const iter_impl& other) noexcept
8926 : m_object(other.m_object), m_it(other.m_it)
8930 @brief copy assignment
8931 @param[in,out] other iterator to copy from
8932 @note It is not checked whether @a other is initialized.
8934 iter_impl& operator=(iter_impl other) noexcept(
8935 std::is_nothrow_move_constructible<pointer>::value and
8936 std::is_nothrow_move_assignable<pointer>::value and
8937 std::is_nothrow_move_constructible<internal_iterator>::value and
8938 std::is_nothrow_move_assignable<internal_iterator>::value
8941 std::swap(m_object, other.m_object);
8942 std::swap(m_it, other.m_it);
8948 @brief set the iterator to the first value
8949 @pre The iterator is initialized; i.e. `m_object != nullptr`.
8951 void set_begin() noexcept
8953 assert(m_object != nullptr);
8955 switch (m_object->m_type)
8957 case basic_json::value_t::object:
8959 m_it.object_iterator = m_object->m_value.object->begin();
8963 case basic_json::value_t::array:
8965 m_it.array_iterator = m_object->m_value.array->begin();
8969 case basic_json::value_t::null:
8971 // set to end so begin()==end() is true: null is empty
8972 m_it.primitive_iterator.set_end();
8978 m_it.primitive_iterator.set_begin();
8985 @brief set the iterator past the last value
8986 @pre The iterator is initialized; i.e. `m_object != nullptr`.
8988 void set_end() noexcept
8990 assert(m_object != nullptr);
8992 switch (m_object->m_type)
8994 case basic_json::value_t::object:
8996 m_it.object_iterator = m_object->m_value.object->end();
9000 case basic_json::value_t::array:
9002 m_it.array_iterator = m_object->m_value.array->end();
9008 m_it.primitive_iterator.set_end();
9016 @brief return a reference to the value pointed to by the iterator
9017 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9019 reference operator*() const
9021 assert(m_object != nullptr);
9023 switch (m_object->m_type)
9025 case basic_json::value_t::object:
9027 assert(m_it.object_iterator != m_object->m_value.object->end());
9028 return m_it.object_iterator->second;
9031 case basic_json::value_t::array:
9033 assert(m_it.array_iterator != m_object->m_value.array->end());
9034 return *m_it.array_iterator;
9037 case basic_json::value_t::null:
9039 JSON_THROW(std::out_of_range("cannot get value"));
9044 if (m_it.primitive_iterator.is_begin())
9049 JSON_THROW(std::out_of_range("cannot get value"));
9055 @brief dereference the iterator
9056 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9058 pointer operator->() const
9060 assert(m_object != nullptr);
9062 switch (m_object->m_type)
9064 case basic_json::value_t::object:
9066 assert(m_it.object_iterator != m_object->m_value.object->end());
9067 return &(m_it.object_iterator->second);
9070 case basic_json::value_t::array:
9072 assert(m_it.array_iterator != m_object->m_value.array->end());
9073 return &*m_it.array_iterator;
9078 if (m_it.primitive_iterator.is_begin())
9083 JSON_THROW(std::out_of_range("cannot get value"));
9089 @brief post-increment (it++)
9090 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9092 iter_impl operator++(int)
9094 auto result = *this;
9100 @brief pre-increment (++it)
9101 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9103 iter_impl& operator++()
9105 assert(m_object != nullptr);
9107 switch (m_object->m_type)
9109 case basic_json::value_t::object:
9111 std::advance(m_it.object_iterator, 1);
9115 case basic_json::value_t::array:
9117 std::advance(m_it.array_iterator, 1);
9123 ++m_it.primitive_iterator;
9132 @brief post-decrement (it--)
9133 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9135 iter_impl operator--(int)
9137 auto result = *this;
9143 @brief pre-decrement (--it)
9144 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9146 iter_impl& operator--()
9148 assert(m_object != nullptr);
9150 switch (m_object->m_type)
9152 case basic_json::value_t::object:
9154 std::advance(m_it.object_iterator, -1);
9158 case basic_json::value_t::array:
9160 std::advance(m_it.array_iterator, -1);
9166 --m_it.primitive_iterator;
9175 @brief comparison: equal
9176 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9178 bool operator==(const iter_impl& other) const
9180 // if objects are not the same, the comparison is undefined
9181 if (m_object != other.m_object)
9183 JSON_THROW(std::domain_error("cannot compare iterators of different containers"));
9186 assert(m_object != nullptr);
9188 switch (m_object->m_type)
9190 case basic_json::value_t::object:
9192 return (m_it.object_iterator == other.m_it.object_iterator);
9195 case basic_json::value_t::array:
9197 return (m_it.array_iterator == other.m_it.array_iterator);
9202 return (m_it.primitive_iterator == other.m_it.primitive_iterator);
9208 @brief comparison: not equal
9209 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9211 bool operator!=(const iter_impl& other) const
9213 return not operator==(other);
9217 @brief comparison: smaller
9218 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9220 bool operator<(const iter_impl& other) const
9222 // if objects are not the same, the comparison is undefined
9223 if (m_object != other.m_object)
9225 JSON_THROW(std::domain_error("cannot compare iterators of different containers"));
9228 assert(m_object != nullptr);
9230 switch (m_object->m_type)
9232 case basic_json::value_t::object:
9234 JSON_THROW(std::domain_error("cannot compare order of object iterators"));
9237 case basic_json::value_t::array:
9239 return (m_it.array_iterator < other.m_it.array_iterator);
9244 return (m_it.primitive_iterator < other.m_it.primitive_iterator);
9250 @brief comparison: less than or equal
9251 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9253 bool operator<=(const iter_impl& other) const
9255 return not other.operator < (*this);
9259 @brief comparison: greater than
9260 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9262 bool operator>(const iter_impl& other) const
9264 return not operator<=(other);
9268 @brief comparison: greater than or equal
9269 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9271 bool operator>=(const iter_impl& other) const
9273 return not operator<(other);
9277 @brief add to iterator
9278 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9280 iter_impl& operator+=(difference_type i)
9282 assert(m_object != nullptr);
9284 switch (m_object->m_type)
9286 case basic_json::value_t::object:
9288 JSON_THROW(std::domain_error("cannot use offsets with object iterators"));
9291 case basic_json::value_t::array:
9293 std::advance(m_it.array_iterator, i);
9299 m_it.primitive_iterator += i;
9308 @brief subtract from iterator
9309 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9311 iter_impl& operator-=(difference_type i)
9313 return operator+=(-i);
9317 @brief add to iterator
9318 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9320 iter_impl operator+(difference_type i)
9322 auto result = *this;
9328 @brief subtract from iterator
9329 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9331 iter_impl operator-(difference_type i)
9333 auto result = *this;
9339 @brief return difference
9340 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9342 difference_type operator-(const iter_impl& other) const
9344 assert(m_object != nullptr);
9346 switch (m_object->m_type)
9348 case basic_json::value_t::object:
9350 JSON_THROW(std::domain_error("cannot use offsets with object iterators"));
9353 case basic_json::value_t::array:
9355 return m_it.array_iterator - other.m_it.array_iterator;
9360 return m_it.primitive_iterator - other.m_it.primitive_iterator;
9366 @brief access to successor
9367 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9369 reference operator[](difference_type n) const
9371 assert(m_object != nullptr);
9373 switch (m_object->m_type)
9375 case basic_json::value_t::object:
9377 JSON_THROW(std::domain_error("cannot use operator[] for object iterators"));
9380 case basic_json::value_t::array:
9382 return *std::next(m_it.array_iterator, n);
9385 case basic_json::value_t::null:
9387 JSON_THROW(std::out_of_range("cannot get value"));
9392 if (m_it.primitive_iterator.get_value() == -n)
9397 JSON_THROW(std::out_of_range("cannot get value"));
9403 @brief return the key of an object iterator
9404 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9406 typename object_t::key_type key() const
9408 assert(m_object != nullptr);
9410 if (m_object->is_object())
9412 return m_it.object_iterator->first;
9415 JSON_THROW(std::domain_error("cannot use key() for non-object iterators"));
9419 @brief return the value of an iterator
9420 @pre The iterator is initialized; i.e. `m_object != nullptr`.
9422 reference value() const
9428 /// associated JSON instance
9429 pointer m_object = nullptr;
9430 /// the actual iterator of the associated instance
9431 internal_iterator m_it = internal_iterator();
9435 @brief a template for a reverse iterator class
9437 @tparam Base the base iterator type to reverse. Valid types are @ref
9438 iterator (to create @ref reverse_iterator) and @ref const_iterator (to
9439 create @ref const_reverse_iterator).
9441 @requirement The class satisfies the following concept requirements:
9442 - [RandomAccessIterator](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator):
9443 The iterator that can be moved to point (forward and backward) to any
9444 element in constant time.
9445 - [OutputIterator](http://en.cppreference.com/w/cpp/concept/OutputIterator):
9446 It is possible to write to the pointed-to element (only if @a Base is
9449 @since version 1.0.0
9451 template<typename Base>
9452 class json_reverse_iterator : public std::reverse_iterator<Base>
9455 /// shortcut to the reverse iterator adaptor
9456 using base_iterator = std::reverse_iterator<Base>;
9457 /// the reference type for the pointed-to element
9458 using reference = typename Base::reference;
9460 /// create reverse iterator from iterator
9461 json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
9465 /// create reverse iterator from base class
9466 json_reverse_iterator(const base_iterator& it) noexcept
9470 /// post-increment (it++)
9471 json_reverse_iterator operator++(int)
9473 return base_iterator::operator++(1);
9476 /// pre-increment (++it)
9477 json_reverse_iterator& operator++()
9479 base_iterator::operator++();
9483 /// post-decrement (it--)
9484 json_reverse_iterator operator--(int)
9486 return base_iterator::operator--(1);
9489 /// pre-decrement (--it)
9490 json_reverse_iterator& operator--()
9492 base_iterator::operator--();
9497 json_reverse_iterator& operator+=(difference_type i)
9499 base_iterator::operator+=(i);
9504 json_reverse_iterator operator+(difference_type i) const
9506 auto result = *this;
9511 /// subtract from iterator
9512 json_reverse_iterator operator-(difference_type i) const
9514 auto result = *this;
9519 /// return difference
9520 difference_type operator-(const json_reverse_iterator& other) const
9522 return this->base() - other.base();
9525 /// access to successor
9526 reference operator[](difference_type n) const
9528 return *(this->operator+(n));
9531 /// return the key of an object iterator
9532 typename object_t::key_type key() const
9534 auto it = --this->base();
9538 /// return the value of an iterator
9539 reference value() const
9541 auto it = --this->base();
9542 return it.operator * ();
9548 //////////////////////
9549 // lexer and parser //
9550 //////////////////////
9553 @brief lexical analysis
9555 This class organizes the lexical analysis during JSON deserialization. The
9556 core of it is a scanner generated by [re2c](http://re2c.org) that
9557 processes a buffer and recognizes tokens according to RFC 7159.
9562 /// token types for the parser
9563 enum class token_type
9565 uninitialized, ///< indicating the scanner is uninitialized
9566 literal_true, ///< the `true` literal
9567 literal_false, ///< the `false` literal
9568 literal_null, ///< the `null` literal
9569 value_string, ///< a string -- use get_string() for actual value
9570 value_unsigned, ///< an unsigned integer -- use get_number() for actual value
9571 value_integer, ///< a signed integer -- use get_number() for actual value
9572 value_float, ///< an floating point number -- use get_number() for actual value
9573 begin_array, ///< the character for array begin `[`
9574 begin_object, ///< the character for object begin `{`
9575 end_array, ///< the character for array end `]`
9576 end_object, ///< the character for object end `}`
9577 name_separator, ///< the name separator `:`
9578 value_separator, ///< the value separator `,`
9579 parse_error, ///< indicating a parse error
9580 end_of_input ///< indicating the end of the input buffer
9583 /// the char type to use in the lexer
9584 using lexer_char_t = unsigned char;
9586 /// a lexer from a buffer with given length
9587 lexer(const lexer_char_t* buff, const size_t len) noexcept
9590 assert(m_content != nullptr);
9591 m_start = m_cursor = m_content;
9592 m_limit = m_content + len;
9595 /// a lexer from an input stream
9596 explicit lexer(std::istream& s)
9597 : m_stream(&s), m_line_buffer()
9599 // immediately abort if stream is erroneous
9602 JSON_THROW(std::invalid_argument("stream error"));
9608 // skip UTF-8 byte-order mark
9609 if (m_line_buffer.size() >= 3 and m_line_buffer.substr(0, 3) == "\xEF\xBB\xBF")
9611 m_line_buffer[0] = ' ';
9612 m_line_buffer[1] = ' ';
9613 m_line_buffer[2] = ' ';
9617 // switch off unwanted functions (due to pointer members)
9619 lexer(const lexer&) = delete;
9620 lexer operator=(const lexer&) = delete;
9623 @brief create a string from one or two Unicode code points
9625 There are two cases: (1) @a codepoint1 is in the Basic Multilingual
9626 Plane (U+0000 through U+FFFF) and @a codepoint2 is 0, or (2)
9627 @a codepoint1 and @a codepoint2 are a UTF-16 surrogate pair to
9628 represent a code point above U+FFFF.
9630 @param[in] codepoint1 the code point (can be high surrogate)
9631 @param[in] codepoint2 the code point (can be low surrogate or 0)
9633 @return string representation of the code point; the length of the
9634 result string is between 1 and 4 characters.
9636 @throw std::out_of_range if code point is > 0x10ffff; example: `"code
9637 points above 0x10FFFF are invalid"`
9638 @throw std::invalid_argument if the low surrogate is invalid; example:
9639 `""missing or wrong low surrogate""`
9641 @complexity Constant.
9643 @see <http://en.wikipedia.org/wiki/UTF-8#Sample_code>
9645 static string_t to_unicode(const std::size_t codepoint1,
9646 const std::size_t codepoint2 = 0)
9648 // calculate the code point from the given code points
9649 std::size_t codepoint = codepoint1;
9651 // check if codepoint1 is a high surrogate
9652 if (codepoint1 >= 0xD800 and codepoint1 <= 0xDBFF)
9654 // check if codepoint2 is a low surrogate
9655 if (codepoint2 >= 0xDC00 and codepoint2 <= 0xDFFF)
9658 // high surrogate occupies the most significant 22 bits
9660 // low surrogate occupies the least significant 15 bits
9662 // there is still the 0xD800, 0xDC00 and 0x10000 noise
9663 // in the result so we have to subtract with:
9664 // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00
9669 JSON_THROW(std::invalid_argument("missing or wrong low surrogate"));
9675 if (codepoint < 0x80)
9677 // 1-byte characters: 0xxxxxxx (ASCII)
9678 result.append(1, static_cast<typename string_t::value_type>(codepoint));
9680 else if (codepoint <= 0x7ff)
9682 // 2-byte characters: 110xxxxx 10xxxxxx
9683 result.append(1, static_cast<typename string_t::value_type>(0xC0 | ((codepoint >> 6) & 0x1F)));
9684 result.append(1, static_cast<typename string_t::value_type>(0x80 | (codepoint & 0x3F)));
9686 else if (codepoint <= 0xffff)
9688 // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx
9689 result.append(1, static_cast<typename string_t::value_type>(0xE0 | ((codepoint >> 12) & 0x0F)));
9690 result.append(1, static_cast<typename string_t::value_type>(0x80 | ((codepoint >> 6) & 0x3F)));
9691 result.append(1, static_cast<typename string_t::value_type>(0x80 | (codepoint & 0x3F)));
9693 else if (codepoint <= 0x10ffff)
9695 // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
9696 result.append(1, static_cast<typename string_t::value_type>(0xF0 | ((codepoint >> 18) & 0x07)));
9697 result.append(1, static_cast<typename string_t::value_type>(0x80 | ((codepoint >> 12) & 0x3F)));
9698 result.append(1, static_cast<typename string_t::value_type>(0x80 | ((codepoint >> 6) & 0x3F)));
9699 result.append(1, static_cast<typename string_t::value_type>(0x80 | (codepoint & 0x3F)));
9703 JSON_THROW(std::out_of_range("code points above 0x10FFFF are invalid"));
9709 /// return name of values of type token_type (only used for errors)
9710 static std::string token_type_name(const token_type t)
9714 case token_type::uninitialized:
9715 return "<uninitialized>";
9716 case token_type::literal_true:
9717 return "true literal";
9718 case token_type::literal_false:
9719 return "false literal";
9720 case token_type::literal_null:
9721 return "null literal";
9722 case token_type::value_string:
9723 return "string literal";
9724 case lexer::token_type::value_unsigned:
9725 case lexer::token_type::value_integer:
9726 case lexer::token_type::value_float:
9727 return "number literal";
9728 case token_type::begin_array:
9730 case token_type::begin_object:
9732 case token_type::end_array:
9734 case token_type::end_object:
9736 case token_type::name_separator:
9738 case token_type::value_separator:
9740 case token_type::parse_error:
9741 return "<parse error>";
9742 case token_type::end_of_input:
9743 return "end of input";
9746 // catch non-enum values
9747 return "unknown token"; // LCOV_EXCL_LINE
9753 This function implements a scanner for JSON. It is specified using
9754 regular expressions that try to follow RFC 7159 as close as possible.
9755 These regular expressions are then translated into a minimized
9756 deterministic finite automaton (DFA) by the tool
9757 [re2c](http://re2c.org). As a result, the translated code for this
9758 function consists of a large block of code with `goto` jumps.
9760 @return the class of the next token read from the buffer
9762 @complexity Linear in the length of the input.\n
9764 Proposition: The loop below will always terminate for finite input.\n
9766 Proof (by contradiction): Assume a finite input. To loop forever, the
9767 loop must never hit code with a `break` statement. The only code
9768 snippets without a `break` statement are the continue statements for
9769 whitespace and byte-order-marks. To loop forever, the input must be an
9770 infinite sequence of whitespace or byte-order-marks. This contradicts
9771 the assumption of finite input, q.e.d.
9777 // pointer for backtracking information
9780 // remember the begin of the token
9782 assert(m_start != nullptr);
9787 unsigned int yyaccept = 0;
9788 static const unsigned char yybm[] =
9790 0, 0, 0, 0, 0, 0, 0, 0,
9791 0, 32, 32, 0, 0, 32, 0, 0,
9792 0, 0, 0, 0, 0, 0, 0, 0,
9793 0, 0, 0, 0, 0, 0, 0, 0,
9794 160, 128, 0, 128, 128, 128, 128, 128,
9795 128, 128, 128, 128, 128, 128, 128, 128,
9796 192, 192, 192, 192, 192, 192, 192, 192,
9797 192, 192, 128, 128, 128, 128, 128, 128,
9798 128, 128, 128, 128, 128, 128, 128, 128,
9799 128, 128, 128, 128, 128, 128, 128, 128,
9800 128, 128, 128, 128, 128, 128, 128, 128,
9801 128, 128, 128, 128, 0, 128, 128, 128,
9802 128, 128, 128, 128, 128, 128, 128, 128,
9803 128, 128, 128, 128, 128, 128, 128, 128,
9804 128, 128, 128, 128, 128, 128, 128, 128,
9805 128, 128, 128, 128, 128, 128, 128, 128,
9806 0, 0, 0, 0, 0, 0, 0, 0,
9807 0, 0, 0, 0, 0, 0, 0, 0,
9808 0, 0, 0, 0, 0, 0, 0, 0,
9809 0, 0, 0, 0, 0, 0, 0, 0,
9810 0, 0, 0, 0, 0, 0, 0, 0,
9811 0, 0, 0, 0, 0, 0, 0, 0,
9812 0, 0, 0, 0, 0, 0, 0, 0,
9813 0, 0, 0, 0, 0, 0, 0, 0,
9814 0, 0, 0, 0, 0, 0, 0, 0,
9815 0, 0, 0, 0, 0, 0, 0, 0,
9816 0, 0, 0, 0, 0, 0, 0, 0,
9817 0, 0, 0, 0, 0, 0, 0, 0,
9818 0, 0, 0, 0, 0, 0, 0, 0,
9819 0, 0, 0, 0, 0, 0, 0, 0,
9820 0, 0, 0, 0, 0, 0, 0, 0,
9821 0, 0, 0, 0, 0, 0, 0, 0,
9823 if ((m_limit - m_cursor) < 5)
9825 fill_line_buffer(5); // LCOV_EXCL_LINE
9828 if (yybm[0 + yych] & 32)
9830 goto basic_json_parser_6;
9840 goto basic_json_parser_2;
9844 goto basic_json_parser_4;
9846 goto basic_json_parser_9;
9852 goto basic_json_parser_4;
9856 goto basic_json_parser_10;
9858 goto basic_json_parser_12;
9867 goto basic_json_parser_4;
9871 goto basic_json_parser_13;
9873 goto basic_json_parser_15;
9879 goto basic_json_parser_17;
9883 goto basic_json_parser_4;
9885 goto basic_json_parser_19;
9897 goto basic_json_parser_21;
9899 goto basic_json_parser_4;
9905 goto basic_json_parser_23;
9909 goto basic_json_parser_4;
9911 goto basic_json_parser_24;
9920 goto basic_json_parser_25;
9922 goto basic_json_parser_4;
9928 goto basic_json_parser_26;
9932 goto basic_json_parser_28;
9934 goto basic_json_parser_4;
9938 basic_json_parser_2:
9941 last_token_type = token_type::end_of_input;
9944 basic_json_parser_4:
9946 basic_json_parser_5:
9948 last_token_type = token_type::parse_error;
9951 basic_json_parser_6:
9953 if (m_limit <= m_cursor)
9955 fill_line_buffer(1); // LCOV_EXCL_LINE
9958 if (yybm[0 + yych] & 32)
9960 goto basic_json_parser_6;
9965 basic_json_parser_9:
9967 yych = *(m_marker = ++m_cursor);
9970 goto basic_json_parser_5;
9974 goto basic_json_parser_31;
9978 goto basic_json_parser_5;
9982 goto basic_json_parser_31;
9984 goto basic_json_parser_5;
9985 basic_json_parser_10:
9988 last_token_type = token_type::value_separator;
9991 basic_json_parser_12:
9995 goto basic_json_parser_5;
9999 goto basic_json_parser_43;
10003 goto basic_json_parser_45;
10005 goto basic_json_parser_5;
10006 basic_json_parser_13:
10008 yych = *(m_marker = ++m_cursor);
10013 goto basic_json_parser_47;
10017 goto basic_json_parser_48;
10026 goto basic_json_parser_51;
10033 goto basic_json_parser_51;
10037 basic_json_parser_14:
10039 last_token_type = token_type::value_unsigned;
10042 basic_json_parser_15:
10044 m_marker = ++m_cursor;
10045 if ((m_limit - m_cursor) < 3)
10047 fill_line_buffer(3); // LCOV_EXCL_LINE
10050 if (yybm[0 + yych] & 64)
10052 goto basic_json_parser_15;
10058 goto basic_json_parser_47;
10060 goto basic_json_parser_14;
10066 goto basic_json_parser_51;
10070 goto basic_json_parser_51;
10072 goto basic_json_parser_14;
10074 basic_json_parser_17:
10077 last_token_type = token_type::name_separator;
10080 basic_json_parser_19:
10083 last_token_type = token_type::begin_array;
10086 basic_json_parser_21:
10089 last_token_type = token_type::end_array;
10092 basic_json_parser_23:
10094 yych = *(m_marker = ++m_cursor);
10097 goto basic_json_parser_52;
10099 goto basic_json_parser_5;
10100 basic_json_parser_24:
10102 yych = *(m_marker = ++m_cursor);
10105 goto basic_json_parser_53;
10107 goto basic_json_parser_5;
10108 basic_json_parser_25:
10110 yych = *(m_marker = ++m_cursor);
10113 goto basic_json_parser_54;
10115 goto basic_json_parser_5;
10116 basic_json_parser_26:
10119 last_token_type = token_type::begin_object;
10122 basic_json_parser_28:
10125 last_token_type = token_type::end_object;
10128 basic_json_parser_30:
10130 if (m_limit <= m_cursor)
10132 fill_line_buffer(1); // LCOV_EXCL_LINE
10135 basic_json_parser_31:
10136 if (yybm[0 + yych] & 128)
10138 goto basic_json_parser_30;
10146 goto basic_json_parser_32;
10150 goto basic_json_parser_33;
10152 goto basic_json_parser_35;
10158 goto basic_json_parser_32;
10162 goto basic_json_parser_36;
10164 goto basic_json_parser_37;
10173 goto basic_json_parser_39;
10175 goto basic_json_parser_38;
10181 goto basic_json_parser_40;
10185 goto basic_json_parser_41;
10189 goto basic_json_parser_42;
10193 basic_json_parser_32:
10194 m_cursor = m_marker;
10199 goto basic_json_parser_5;
10203 goto basic_json_parser_14;
10210 goto basic_json_parser_44;
10214 goto basic_json_parser_58;
10217 basic_json_parser_33:
10220 last_token_type = token_type::value_string;
10223 basic_json_parser_35:
10225 if (m_limit <= m_cursor)
10227 fill_line_buffer(1); // LCOV_EXCL_LINE
10236 goto basic_json_parser_30;
10240 goto basic_json_parser_32;
10242 goto basic_json_parser_30;
10250 goto basic_json_parser_32;
10252 goto basic_json_parser_30;
10258 goto basic_json_parser_30;
10260 goto basic_json_parser_32;
10270 goto basic_json_parser_30;
10274 goto basic_json_parser_30;
10276 goto basic_json_parser_32;
10284 goto basic_json_parser_30;
10286 goto basic_json_parser_32;
10292 goto basic_json_parser_30;
10296 goto basic_json_parser_55;
10298 goto basic_json_parser_32;
10302 basic_json_parser_36:
10304 if (m_limit <= m_cursor)
10306 fill_line_buffer(1); // LCOV_EXCL_LINE
10311 goto basic_json_parser_32;
10315 goto basic_json_parser_30;
10317 goto basic_json_parser_32;
10318 basic_json_parser_37:
10320 if (m_limit <= m_cursor)
10322 fill_line_buffer(1); // LCOV_EXCL_LINE
10327 goto basic_json_parser_32;
10331 goto basic_json_parser_36;
10333 goto basic_json_parser_32;
10334 basic_json_parser_38:
10336 if (m_limit <= m_cursor)
10338 fill_line_buffer(1); // LCOV_EXCL_LINE
10343 goto basic_json_parser_32;
10347 goto basic_json_parser_36;
10349 goto basic_json_parser_32;
10350 basic_json_parser_39:
10352 if (m_limit <= m_cursor)
10354 fill_line_buffer(1); // LCOV_EXCL_LINE
10359 goto basic_json_parser_32;
10363 goto basic_json_parser_36;
10365 goto basic_json_parser_32;
10366 basic_json_parser_40:
10368 if (m_limit <= m_cursor)
10370 fill_line_buffer(1); // LCOV_EXCL_LINE
10375 goto basic_json_parser_32;
10379 goto basic_json_parser_38;
10381 goto basic_json_parser_32;
10382 basic_json_parser_41:
10384 if (m_limit <= m_cursor)
10386 fill_line_buffer(1); // LCOV_EXCL_LINE
10391 goto basic_json_parser_32;
10395 goto basic_json_parser_38;
10397 goto basic_json_parser_32;
10398 basic_json_parser_42:
10400 if (m_limit <= m_cursor)
10402 fill_line_buffer(1); // LCOV_EXCL_LINE
10407 goto basic_json_parser_32;
10411 goto basic_json_parser_38;
10413 goto basic_json_parser_32;
10414 basic_json_parser_43:
10416 yych = *(m_marker = ++m_cursor);
10421 goto basic_json_parser_47;
10425 goto basic_json_parser_48;
10434 goto basic_json_parser_51;
10441 goto basic_json_parser_51;
10445 basic_json_parser_44:
10447 last_token_type = token_type::value_integer;
10450 basic_json_parser_45:
10452 m_marker = ++m_cursor;
10453 if ((m_limit - m_cursor) < 3)
10455 fill_line_buffer(3); // LCOV_EXCL_LINE
10462 goto basic_json_parser_47;
10466 goto basic_json_parser_44;
10468 goto basic_json_parser_45;
10476 goto basic_json_parser_44;
10478 goto basic_json_parser_51;
10484 goto basic_json_parser_51;
10486 goto basic_json_parser_44;
10489 basic_json_parser_47:
10490 yych = *++m_cursor;
10493 goto basic_json_parser_32;
10497 goto basic_json_parser_56;
10499 goto basic_json_parser_32;
10500 basic_json_parser_48:
10502 if (m_limit <= m_cursor)
10504 fill_line_buffer(1); // LCOV_EXCL_LINE
10509 goto basic_json_parser_50;
10513 goto basic_json_parser_48;
10515 basic_json_parser_50:
10517 last_token_type = token_type::parse_error;
10520 basic_json_parser_51:
10521 yych = *++m_cursor;
10526 goto basic_json_parser_59;
10528 goto basic_json_parser_32;
10534 goto basic_json_parser_59;
10538 goto basic_json_parser_32;
10542 goto basic_json_parser_60;
10544 goto basic_json_parser_32;
10546 basic_json_parser_52:
10547 yych = *++m_cursor;
10550 goto basic_json_parser_62;
10552 goto basic_json_parser_32;
10553 basic_json_parser_53:
10554 yych = *++m_cursor;
10557 goto basic_json_parser_63;
10559 goto basic_json_parser_32;
10560 basic_json_parser_54:
10561 yych = *++m_cursor;
10564 goto basic_json_parser_64;
10566 goto basic_json_parser_32;
10567 basic_json_parser_55:
10569 if (m_limit <= m_cursor)
10571 fill_line_buffer(1); // LCOV_EXCL_LINE
10578 goto basic_json_parser_32;
10582 goto basic_json_parser_65;
10584 goto basic_json_parser_32;
10590 goto basic_json_parser_65;
10594 goto basic_json_parser_32;
10598 goto basic_json_parser_65;
10600 goto basic_json_parser_32;
10602 basic_json_parser_56:
10604 m_marker = ++m_cursor;
10605 if ((m_limit - m_cursor) < 3)
10607 fill_line_buffer(3); // LCOV_EXCL_LINE
10614 goto basic_json_parser_58;
10618 goto basic_json_parser_56;
10625 goto basic_json_parser_51;
10629 goto basic_json_parser_51;
10632 basic_json_parser_58:
10634 last_token_type = token_type::value_float;
10637 basic_json_parser_59:
10638 yych = *++m_cursor;
10641 goto basic_json_parser_32;
10645 goto basic_json_parser_32;
10647 basic_json_parser_60:
10649 if (m_limit <= m_cursor)
10651 fill_line_buffer(1); // LCOV_EXCL_LINE
10656 goto basic_json_parser_58;
10660 goto basic_json_parser_60;
10662 goto basic_json_parser_58;
10663 basic_json_parser_62:
10664 yych = *++m_cursor;
10667 goto basic_json_parser_66;
10669 goto basic_json_parser_32;
10670 basic_json_parser_63:
10671 yych = *++m_cursor;
10674 goto basic_json_parser_67;
10676 goto basic_json_parser_32;
10677 basic_json_parser_64:
10678 yych = *++m_cursor;
10681 goto basic_json_parser_69;
10683 goto basic_json_parser_32;
10684 basic_json_parser_65:
10686 if (m_limit <= m_cursor)
10688 fill_line_buffer(1); // LCOV_EXCL_LINE
10695 goto basic_json_parser_32;
10699 goto basic_json_parser_71;
10701 goto basic_json_parser_32;
10707 goto basic_json_parser_71;
10711 goto basic_json_parser_32;
10715 goto basic_json_parser_71;
10717 goto basic_json_parser_32;
10719 basic_json_parser_66:
10720 yych = *++m_cursor;
10723 goto basic_json_parser_72;
10725 goto basic_json_parser_32;
10726 basic_json_parser_67:
10729 last_token_type = token_type::literal_null;
10732 basic_json_parser_69:
10735 last_token_type = token_type::literal_true;
10738 basic_json_parser_71:
10740 if (m_limit <= m_cursor)
10742 fill_line_buffer(1); // LCOV_EXCL_LINE
10749 goto basic_json_parser_32;
10753 goto basic_json_parser_74;
10755 goto basic_json_parser_32;
10761 goto basic_json_parser_74;
10765 goto basic_json_parser_32;
10769 goto basic_json_parser_74;
10771 goto basic_json_parser_32;
10773 basic_json_parser_72:
10776 last_token_type = token_type::literal_false;
10779 basic_json_parser_74:
10781 if (m_limit <= m_cursor)
10783 fill_line_buffer(1); // LCOV_EXCL_LINE
10790 goto basic_json_parser_32;
10794 goto basic_json_parser_30;
10796 goto basic_json_parser_32;
10802 goto basic_json_parser_30;
10806 goto basic_json_parser_32;
10810 goto basic_json_parser_30;
10812 goto basic_json_parser_32;
10818 return last_token_type;
10822 @brief append data from the stream to the line buffer
10824 This function is called by the scan() function when the end of the
10825 buffer (`m_limit`) is reached and the `m_cursor` pointer cannot be
10826 incremented without leaving the limits of the line buffer. Note re2c
10827 decides when to call this function.
10829 If the lexer reads from contiguous storage, there is no trailing null
10830 byte. Therefore, this function must make sure to add these padding
10833 If the lexer reads from an input stream, this function reads the next
10837 p p p p p p u u u u u x . . . . . .
10839 m_content m_start | m_limit
10843 u u u u u x x x x x x x . . . . . .
10849 void fill_line_buffer(size_t n = 0)
10851 // if line buffer is used, m_content points to its data
10852 assert(m_line_buffer.empty()
10853 or m_content == reinterpret_cast<const lexer_char_t*>(m_line_buffer.data()));
10855 // if line buffer is used, m_limit is set past the end of its data
10856 assert(m_line_buffer.empty()
10857 or m_limit == m_content + m_line_buffer.size());
10859 // pointer relationships
10860 assert(m_content <= m_start);
10861 assert(m_start <= m_cursor);
10862 assert(m_cursor <= m_limit);
10863 assert(m_marker == nullptr or m_marker <= m_limit);
10865 // number of processed characters (p)
10866 const auto num_processed_chars = static_cast<size_t>(m_start - m_content);
10867 // offset for m_marker wrt. to m_start
10868 const auto offset_marker = (m_marker == nullptr) ? 0 : m_marker - m_start;
10869 // number of unprocessed characters (u)
10870 const auto offset_cursor = m_cursor - m_start;
10872 // no stream is used or end of file is reached
10873 if (m_stream == nullptr or m_stream->eof())
10875 // m_start may or may not be pointing into m_line_buffer at
10876 // this point. We trust the standard library to do the right
10877 // thing. See http://stackoverflow.com/q/28142011/266378
10878 m_line_buffer.assign(m_start, m_limit);
10880 // append n characters to make sure that there is sufficient
10881 // space between m_cursor and m_limit
10882 m_line_buffer.append(1, '\x00');
10885 m_line_buffer.append(n - 1, '\x01');
10890 // delete processed characters from line buffer
10891 m_line_buffer.erase(0, num_processed_chars);
10892 // read next line from input stream
10893 m_line_buffer_tmp.clear();
10894 std::getline(*m_stream, m_line_buffer_tmp, '\n');
10896 // add line with newline symbol to the line buffer
10897 m_line_buffer += m_line_buffer_tmp;
10898 m_line_buffer.push_back('\n');
10902 m_content = reinterpret_cast<const lexer_char_t*>(m_line_buffer.data());
10903 assert(m_content != nullptr);
10904 m_start = m_content;
10905 m_marker = m_start + offset_marker;
10906 m_cursor = m_start + offset_cursor;
10907 m_limit = m_start + m_line_buffer.size();
10910 /// return string representation of last read token
10911 string_t get_token_string() const
10913 assert(m_start != nullptr);
10914 return string_t(reinterpret_cast<typename string_t::const_pointer>(m_start),
10915 static_cast<size_t>(m_cursor - m_start));
10919 @brief return string value for string tokens
10921 The function iterates the characters between the opening and closing
10922 quotes of the string value. The complete string is the range
10923 [m_start,m_cursor). Consequently, we iterate from m_start+1 to
10926 We differentiate two cases:
10928 1. Escaped characters. In this case, a new character is constructed
10929 according to the nature of the escape. Some escapes create new
10930 characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied
10931 as is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape
10932 `"\\uxxxx"` need special care. In this case, to_unicode takes care
10933 of the construction of the values.
10934 2. Unescaped characters are copied as is.
10936 @pre `m_cursor - m_start >= 2`, meaning the length of the last token
10937 is at least 2 bytes which is trivially true for any string (which
10938 consists of at least two quotes).
10944 @complexity Linear in the length of the string.\n
10946 Lemma: The loop body will always terminate.\n
10948 Proof (by contradiction): Assume the loop body does not terminate. As
10949 the loop body does not contain another loop, one of the called
10950 functions must never return. The called functions are `std::strtoul`
10951 and to_unicode. Neither function can loop forever, so the loop body
10952 will never loop forever which contradicts the assumption that the loop
10953 body does not terminate, q.e.d.\n
10955 Lemma: The loop condition for the for loop is eventually false.\n
10957 Proof (by contradiction): Assume the loop does not terminate. Due to
10958 the above lemma, this can only be due to a tautological loop
10959 condition; that is, the loop condition i < m_cursor - 1 must always be
10960 true. Let x be the change of i for any loop iteration. Then
10961 m_start + 1 + x < m_cursor - 1 must hold to loop indefinitely. This
10962 can be rephrased to m_cursor - m_start - 2 > x. With the
10963 precondition, we x <= 0, meaning that the loop condition holds
10964 indefinitely if i is always decreased. However, observe that the value
10965 of i is strictly increasing with each iteration, as it is incremented
10966 by 1 in the iteration expression and never decremented inside the loop
10967 body. Hence, the loop condition will eventually be false which
10968 contradicts the assumption that the loop condition is a tautology,
10971 @return string value of current token without opening and closing
10973 @throw std::out_of_range if to_unicode fails
10975 string_t get_string() const
10977 assert(m_cursor - m_start >= 2);
10980 result.reserve(static_cast<size_t>(m_cursor - m_start - 2));
10982 // iterate the result between the quotes
10983 for (const lexer_char_t* i = m_start + 1; i < m_cursor - 1; ++i)
10985 // find next escape character
10986 auto e = std::find(i, m_cursor - 1, '\\');
10989 // see https://github.com/nlohmann/json/issues/365#issuecomment-262874705
10990 for (auto k = i; k < e; k++)
10992 result.push_back(static_cast<typename string_t::value_type>(*k));
10994 i = e - 1; // -1 because of ++i
10998 // processing escaped character
10999 // read next character
11004 // the default escapes
11049 // get code xxxx from uxxxx
11050 auto codepoint = std::strtoul(std::string(reinterpret_cast<typename string_t::const_pointer>(i + 1),
11051 4).c_str(), nullptr, 16);
11053 // check if codepoint is a high surrogate
11054 if (codepoint >= 0xD800 and codepoint <= 0xDBFF)
11056 // make sure there is a subsequent unicode
11057 if ((i + 6 >= m_limit) or * (i + 5) != '\\' or * (i + 6) != 'u')
11059 JSON_THROW(std::invalid_argument("missing low surrogate"));
11062 // get code yyyy from uxxxx\uyyyy
11063 auto codepoint2 = std::strtoul(std::string(reinterpret_cast<typename string_t::const_pointer>
11064 (i + 7), 4).c_str(), nullptr, 16);
11065 result += to_unicode(codepoint, codepoint2);
11066 // skip the next 10 characters (xxxx\uyyyy)
11069 else if (codepoint >= 0xDC00 and codepoint <= 0xDFFF)
11071 // we found a lone low surrogate
11072 JSON_THROW(std::invalid_argument("missing high surrogate"));
11076 // add unicode character(s)
11077 result += to_unicode(codepoint);
11078 // skip the next four characters (xxxx)
11092 @brief parse string into a built-in arithmetic type as if the current
11095 @note in floating-point case strtod may parse past the token's end -
11096 this is not an error
11098 @note any leading blanks are not handled
11103 strtonum(const char* start, const char* end)
11104 : m_start(start), m_end(end)
11108 @return true iff parsed successfully as number of type T
11110 @param[in,out] val shall contain parsed value, or undefined value
11113 template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value>::type>
11114 bool to(T& val) const
11116 return parse(val, std::is_integral<T>());
11120 const char* const m_start = nullptr;
11121 const char* const m_end = nullptr;
11123 // floating-point conversion
11125 // overloaded wrappers for strtod/strtof/strtold
11126 // that will be called from parse<floating_point_t>
11127 static void strtof(float& f, const char* str, char** endptr)
11129 f = std::strtof(str, endptr);
11132 static void strtof(double& f, const char* str, char** endptr)
11134 f = std::strtod(str, endptr);
11137 static void strtof(long double& f, const char* str, char** endptr)
11139 f = std::strtold(str, endptr);
11142 template<typename T>
11143 bool parse(T& value, /*is_integral=*/std::false_type) const
11145 // replace decimal separator with locale-specific version,
11146 // when necessary; data will point to either the original
11147 // string, or buf, or tempstr containing the fixed string.
11148 std::string tempstr;
11149 std::array<char, 64> buf;
11150 const size_t len = static_cast<size_t>(m_end - m_start);
11152 // lexer will reject empty numbers
11155 // since dealing with strtod family of functions, we're
11156 // getting the decimal point char from the C locale facilities
11157 // instead of C++'s numpunct facet of the current std::locale
11158 const auto loc = localeconv();
11159 assert(loc != nullptr);
11160 const char decimal_point_char = (loc->decimal_point == nullptr) ? '.' : loc->decimal_point[0];
11162 const char* data = m_start;
11164 if (decimal_point_char != '.')
11166 const size_t ds_pos = static_cast<size_t>(std::find(m_start, m_end, '.') - m_start);
11170 // copy the data into the local buffer or tempstr, if
11171 // buffer is too small; replace decimal separator, and
11172 // update data to point to the modified bytes
11173 if ((len + 1) < buf.size())
11175 std::copy(m_start, m_end, buf.begin());
11177 buf[ds_pos] = decimal_point_char;
11182 tempstr.assign(m_start, m_end);
11183 tempstr[ds_pos] = decimal_point_char;
11184 data = tempstr.c_str();
11189 char* endptr = nullptr;
11191 // this calls appropriate overload depending on T
11192 strtof(value, data, &endptr);
11194 // parsing was successful iff strtof parsed exactly the number
11195 // of characters determined by the lexer (len)
11196 const bool ok = (endptr == (data + len));
11198 if (ok and (value == static_cast<T>(0.0)) and (*data == '-'))
11200 // some implementations forget to negate the zero
11207 // integral conversion
11209 signed long long parse_integral(char** endptr, /*is_signed*/std::true_type) const
11211 return std::strtoll(m_start, endptr, 10);
11214 unsigned long long parse_integral(char** endptr, /*is_signed*/std::false_type) const
11216 return std::strtoull(m_start, endptr, 10);
11219 template<typename T>
11220 bool parse(T& value, /*is_integral=*/std::true_type) const
11222 char* endptr = nullptr;
11223 errno = 0; // these are thread-local
11224 const auto x = parse_integral(&endptr, std::is_signed<T>());
11226 // called right overload?
11227 static_assert(std::is_signed<T>() == std::is_signed<decltype(x)>(), "");
11229 value = static_cast<T>(x);
11231 return (x == static_cast<decltype(x)>(value)) // x fits into destination T
11232 and (x < 0) == (value < 0) // preserved sign
11233 //and ((x != 0) or is_integral()) // strto[u]ll did nto fail
11234 and (errno == 0) // strto[u]ll did not overflow
11235 and (m_start < m_end) // token was not empty
11236 and (endptr == m_end); // parsed entire token exactly
11241 @brief return number value for number tokens
11243 This function translates the last token into the most appropriate
11244 number type (either integer, unsigned integer or floating point),
11245 which is passed back to the caller via the result parameter.
11247 integral numbers that don't fit into the the range of the respective
11248 type are parsed as number_float_t
11250 floating-point values do not satisfy std::isfinite predicate
11251 are converted to value_t::null
11253 throws if the entire string [m_start .. m_cursor) cannot be
11254 interpreted as a number
11256 @param[out] result @ref basic_json object to receive the number.
11257 @param[in] token the type of the number token
11259 bool get_number(basic_json& result, const token_type token) const
11261 assert(m_start != nullptr);
11262 assert(m_start < m_cursor);
11263 assert((token == token_type::value_unsigned) or
11264 (token == token_type::value_integer) or
11265 (token == token_type::value_float));
11267 strtonum num_converter(reinterpret_cast<const char*>(m_start),
11268 reinterpret_cast<const char*>(m_cursor));
11272 case lexer::token_type::value_unsigned:
11274 number_unsigned_t val;
11275 if (num_converter.to(val))
11277 // parsing successful
11278 result.m_type = value_t::number_unsigned;
11279 result.m_value = val;
11285 case lexer::token_type::value_integer:
11287 number_integer_t val;
11288 if (num_converter.to(val))
11290 // parsing successful
11291 result.m_type = value_t::number_integer;
11292 result.m_value = val;
11304 // parse float (either explicitly or because a previous conversion
11306 number_float_t val;
11307 if (num_converter.to(val))
11309 // parsing successful
11310 result.m_type = value_t::number_float;
11311 result.m_value = val;
11313 // replace infinity and NAN by null
11314 if (not std::isfinite(result.m_value.number_float))
11316 result.m_type = value_t::null;
11317 result.m_value = basic_json::json_value();
11323 // couldn't parse number in any format
11328 /// optional input stream
11329 std::istream* m_stream = nullptr;
11330 /// line buffer buffer for m_stream
11331 string_t m_line_buffer {};
11332 /// used for filling m_line_buffer
11333 string_t m_line_buffer_tmp {};
11334 /// the buffer pointer
11335 const lexer_char_t* m_content = nullptr;
11336 /// pointer to the beginning of the current symbol
11337 const lexer_char_t* m_start = nullptr;
11338 /// pointer for backtracking information
11339 const lexer_char_t* m_marker = nullptr;
11340 /// pointer to the current symbol
11341 const lexer_char_t* m_cursor = nullptr;
11342 /// pointer to the end of the buffer
11343 const lexer_char_t* m_limit = nullptr;
11344 /// the last token type
11345 token_type last_token_type = token_type::end_of_input;
11349 @brief syntax analysis
11351 This class implements a recursive decent parser.
11356 /// a parser reading from a string literal
11357 parser(const char* buff, const parser_callback_t cb = nullptr)
11359 m_lexer(reinterpret_cast<const typename lexer::lexer_char_t*>(buff), std::strlen(buff))
11362 /// a parser reading from an input stream
11363 parser(std::istream& is, const parser_callback_t cb = nullptr)
11364 : callback(cb), m_lexer(is)
11367 /// a parser reading from an iterator range with contiguous storage
11368 template<class IteratorType, typename std::enable_if<
11369 std::is_same<typename std::iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value
11372 parser(IteratorType first, IteratorType last, const parser_callback_t cb = nullptr)
11374 m_lexer(reinterpret_cast<const typename lexer::lexer_char_t*>(&(*first)),
11375 static_cast<size_t>(std::distance(first, last)))
11378 /// public parser interface
11381 // read first token
11384 basic_json result = parse_internal(true);
11385 result.assert_invariant();
11387 expect(lexer::token_type::end_of_input);
11389 // return parser result and replace it with null in case the
11390 // top-level value was discarded by the callback function
11391 return result.is_discarded() ? basic_json() : std::move(result);
11395 /// the actual parser
11396 basic_json parse_internal(bool keep)
11398 auto result = basic_json(value_t::discarded);
11400 switch (last_token)
11402 case lexer::token_type::begin_object:
11404 if (keep and (not callback
11405 or ((keep = callback(depth++, parse_event_t::object_start, result)) != 0)))
11407 // explicitly set result to object to cope with {}
11408 result.m_type = value_t::object;
11409 result.m_value = value_t::object;
11415 // closing } -> we are done
11416 if (last_token == lexer::token_type::end_object)
11419 if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
11421 result = basic_json(value_t::discarded);
11426 // no comma is expected here
11427 unexpect(lexer::token_type::value_separator);
11429 // otherwise: parse key-value pairs
11432 // ugly, but could be fixed with loop reorganization
11433 if (last_token == lexer::token_type::value_separator)
11439 expect(lexer::token_type::value_string);
11440 const auto key = m_lexer.get_string();
11442 bool keep_tag = false;
11448 keep_tag = callback(depth, parse_event_t::key, k);
11456 // parse separator (:)
11458 expect(lexer::token_type::name_separator);
11460 // parse and add value
11462 auto value = parse_internal(keep);
11463 if (keep and keep_tag and not value.is_discarded())
11465 result[key] = std::move(value);
11468 while (last_token == lexer::token_type::value_separator);
11471 expect(lexer::token_type::end_object);
11473 if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
11475 result = basic_json(value_t::discarded);
11481 case lexer::token_type::begin_array:
11483 if (keep and (not callback
11484 or ((keep = callback(depth++, parse_event_t::array_start, result)) != 0)))
11486 // explicitly set result to object to cope with []
11487 result.m_type = value_t::array;
11488 result.m_value = value_t::array;
11494 // closing ] -> we are done
11495 if (last_token == lexer::token_type::end_array)
11498 if (callback and not callback(--depth, parse_event_t::array_end, result))
11500 result = basic_json(value_t::discarded);
11505 // no comma is expected here
11506 unexpect(lexer::token_type::value_separator);
11508 // otherwise: parse values
11511 // ugly, but could be fixed with loop reorganization
11512 if (last_token == lexer::token_type::value_separator)
11518 auto value = parse_internal(keep);
11519 if (keep and not value.is_discarded())
11521 result.push_back(std::move(value));
11524 while (last_token == lexer::token_type::value_separator);
11527 expect(lexer::token_type::end_array);
11529 if (keep and callback and not callback(--depth, parse_event_t::array_end, result))
11531 result = basic_json(value_t::discarded);
11537 case lexer::token_type::literal_null:
11540 result.m_type = value_t::null;
11544 case lexer::token_type::value_string:
11546 const auto s = m_lexer.get_string();
11548 result = basic_json(s);
11552 case lexer::token_type::literal_true:
11555 result.m_type = value_t::boolean;
11556 result.m_value = true;
11560 case lexer::token_type::literal_false:
11563 result.m_type = value_t::boolean;
11564 result.m_value = false;
11568 case lexer::token_type::value_unsigned:
11569 case lexer::token_type::value_integer:
11570 case lexer::token_type::value_float:
11572 m_lexer.get_number(result, last_token);
11579 // the last token was unexpected
11580 unexpect(last_token);
11584 if (keep and callback and not callback(depth, parse_event_t::value, result))
11586 result = basic_json(value_t::discarded);
11591 /// get next token from lexer
11592 typename lexer::token_type get_token()
11594 last_token = m_lexer.scan();
11598 void expect(typename lexer::token_type t) const
11600 if (t != last_token)
11602 std::string error_msg = "parse error - unexpected ";
11603 error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() +
11605 lexer::token_type_name(last_token));
11606 error_msg += "; expected " + lexer::token_type_name(t);
11607 JSON_THROW(std::invalid_argument(error_msg));
11611 void unexpect(typename lexer::token_type t) const
11613 if (t == last_token)
11615 std::string error_msg = "parse error - unexpected ";
11616 error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() +
11618 lexer::token_type_name(last_token));
11619 JSON_THROW(std::invalid_argument(error_msg));
11624 /// current level of recursion
11626 /// callback function
11627 const parser_callback_t callback = nullptr;
11628 /// the type of the last read token
11629 typename lexer::token_type last_token = lexer::token_type::uninitialized;
11636 @brief JSON Pointer
11638 A JSON pointer defines a string syntax for identifying a specific value
11639 within a JSON document. It can be used with functions `at` and
11640 `operator[]`. Furthermore, JSON pointers are the base for JSON patches.
11642 @sa [RFC 6901](https://tools.ietf.org/html/rfc6901)
11644 @since version 2.0.0
11648 /// allow basic_json to access private members
11649 friend class basic_json;
11653 @brief create JSON pointer
11655 Create a JSON pointer according to the syntax described in
11656 [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3).
11658 @param[in] s string representing the JSON pointer; if omitted, the
11659 empty string is assumed which references the whole JSON
11662 @throw std::domain_error if reference token is nonempty and does not
11663 begin with a slash (`/`); example: `"JSON pointer must be empty or
11665 @throw std::domain_error if a tilde (`~`) is not followed by `0`
11666 (representing `~`) or `1` (representing `/`); example: `"escape error:
11667 ~ must be followed with 0 or 1"`
11669 @liveexample{The example shows the construction several valid JSON
11670 pointers as well as the exceptional behavior.,json_pointer}
11672 @since version 2.0.0
11674 explicit json_pointer(const std::string& s = "")
11675 : reference_tokens(split(s))
11679 @brief return a string representation of the JSON pointer
11681 @invariant For each JSON pointer `ptr`, it holds:
11683 ptr == json_pointer(ptr.to_string());
11686 @return a string representation of the JSON pointer
11688 @liveexample{The example shows the result of `to_string`.,
11689 json_pointer__to_string}
11691 @since version 2.0.0
11693 std::string to_string() const noexcept
11695 return std::accumulate(reference_tokens.begin(),
11696 reference_tokens.end(), std::string{},
11697 [](const std::string & a, const std::string & b)
11699 return a + "/" + escape(b);
11703 /// @copydoc to_string()
11704 operator std::string() const
11706 return to_string();
11710 /// remove and return last reference pointer
11711 std::string pop_back()
11715 JSON_THROW(std::domain_error("JSON pointer has no parent"));
11718 auto last = reference_tokens.back();
11719 reference_tokens.pop_back();
11723 /// return whether pointer points to the root document
11724 bool is_root() const
11726 return reference_tokens.empty();
11729 json_pointer top() const
11733 JSON_THROW(std::domain_error("JSON pointer has no parent"));
11736 json_pointer result = *this;
11737 result.reference_tokens = {reference_tokens[0]};
11742 @brief create and return a reference to the pointed to value
11744 @complexity Linear in the number of reference tokens.
11746 reference get_and_create(reference j) const
11748 pointer result = &j;
11750 // in case no reference tokens exist, return a reference to the
11751 // JSON value j which will be overwritten by a primitive value
11752 for (const auto& reference_token : reference_tokens)
11754 switch (result->m_type)
11756 case value_t::null:
11758 if (reference_token == "0")
11760 // start a new array if reference token is 0
11761 result = &result->operator[](0);
11765 // start a new object otherwise
11766 result = &result->operator[](reference_token);
11771 case value_t::object:
11773 // create an entry in the object
11774 result = &result->operator[](reference_token);
11778 case value_t::array:
11780 // create an entry in the array
11781 result = &result->operator[](static_cast<size_type>(std::stoi(reference_token)));
11786 The following code is only reached if there exists a
11787 reference token _and_ the current value is primitive. In
11788 this case, we have an error situation, because primitive
11789 values may only occur as single value; that is, with an
11790 empty list of reference tokens.
11794 JSON_THROW(std::domain_error("invalid value to unflatten"));
11803 @brief return a reference to the pointed to value
11805 @note This version does not throw if a value is not present, but tries
11806 to create nested values instead. For instance, calling this function
11807 with pointer `"/this/that"` on a null value is equivalent to calling
11808 `operator[]("this").operator[]("that")` on that value, effectively
11809 changing the null value to an object.
11811 @param[in] ptr a JSON value
11813 @return reference to the JSON value pointed to by the JSON pointer
11815 @complexity Linear in the length of the JSON pointer.
11817 @throw std::out_of_range if the JSON pointer can not be resolved
11818 @throw std::domain_error if an array index begins with '0'
11819 @throw std::invalid_argument if an array index was not a number
11821 reference get_unchecked(pointer ptr) const
11823 for (const auto& reference_token : reference_tokens)
11825 // convert null values to arrays or objects before continuing
11826 if (ptr->m_type == value_t::null)
11828 // check if reference token is a number
11829 const bool nums = std::all_of(reference_token.begin(),
11830 reference_token.end(),
11833 return std::isdigit(x);
11836 // change value to array for numbers or "-" or to object
11838 if (nums or reference_token == "-")
11840 *ptr = value_t::array;
11844 *ptr = value_t::object;
11848 switch (ptr->m_type)
11850 case value_t::object:
11852 // use unchecked object access
11853 ptr = &ptr->operator[](reference_token);
11857 case value_t::array:
11859 // error condition (cf. RFC 6901, Sect. 4)
11860 if (reference_token.size() > 1 and reference_token[0] == '0')
11862 JSON_THROW(std::domain_error("array index must not begin with '0'"));
11865 if (reference_token == "-")
11867 // explicitly treat "-" as index beyond the end
11868 ptr = &ptr->operator[](ptr->m_value.array->size());
11872 // convert array index to number; unchecked access
11873 ptr = &ptr->operator[](static_cast<size_type>(std::stoi(reference_token)));
11880 JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'"));
11888 reference get_checked(pointer ptr) const
11890 for (const auto& reference_token : reference_tokens)
11892 switch (ptr->m_type)
11894 case value_t::object:
11896 // note: at performs range check
11897 ptr = &ptr->at(reference_token);
11901 case value_t::array:
11903 if (reference_token == "-")
11905 // "-" always fails the range check
11906 JSON_THROW(std::out_of_range("array index '-' (" +
11907 std::to_string(ptr->m_value.array->size()) +
11908 ") is out of range"));
11911 // error condition (cf. RFC 6901, Sect. 4)
11912 if (reference_token.size() > 1 and reference_token[0] == '0')
11914 JSON_THROW(std::domain_error("array index must not begin with '0'"));
11917 // note: at performs range check
11918 ptr = &ptr->at(static_cast<size_type>(std::stoi(reference_token)));
11924 JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'"));
11933 @brief return a const reference to the pointed to value
11935 @param[in] ptr a JSON value
11937 @return const reference to the JSON value pointed to by the JSON
11940 const_reference get_unchecked(const_pointer ptr) const
11942 for (const auto& reference_token : reference_tokens)
11944 switch (ptr->m_type)
11946 case value_t::object:
11948 // use unchecked object access
11949 ptr = &ptr->operator[](reference_token);
11953 case value_t::array:
11955 if (reference_token == "-")
11957 // "-" cannot be used for const access
11958 JSON_THROW(std::out_of_range("array index '-' (" +
11959 std::to_string(ptr->m_value.array->size()) +
11960 ") is out of range"));
11963 // error condition (cf. RFC 6901, Sect. 4)
11964 if (reference_token.size() > 1 and reference_token[0] == '0')
11966 JSON_THROW(std::domain_error("array index must not begin with '0'"));
11969 // use unchecked array access
11970 ptr = &ptr->operator[](static_cast<size_type>(std::stoi(reference_token)));
11976 JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'"));
11984 const_reference get_checked(const_pointer ptr) const
11986 for (const auto& reference_token : reference_tokens)
11988 switch (ptr->m_type)
11990 case value_t::object:
11992 // note: at performs range check
11993 ptr = &ptr->at(reference_token);
11997 case value_t::array:
11999 if (reference_token == "-")
12001 // "-" always fails the range check
12002 JSON_THROW(std::out_of_range("array index '-' (" +
12003 std::to_string(ptr->m_value.array->size()) +
12004 ") is out of range"));
12007 // error condition (cf. RFC 6901, Sect. 4)
12008 if (reference_token.size() > 1 and reference_token[0] == '0')
12010 JSON_THROW(std::domain_error("array index must not begin with '0'"));
12013 // note: at performs range check
12014 ptr = &ptr->at(static_cast<size_type>(std::stoi(reference_token)));
12020 JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'"));
12028 /// split the string input to reference tokens
12029 static std::vector<std::string> split(const std::string& reference_string)
12031 std::vector<std::string> result;
12033 // special case: empty reference string -> no reference tokens
12034 if (reference_string.empty())
12039 // check if nonempty reference string begins with slash
12040 if (reference_string[0] != '/')
12042 JSON_THROW(std::domain_error("JSON pointer must be empty or begin with '/'"));
12045 // extract the reference tokens:
12046 // - slash: position of the last read slash (or end of string)
12047 // - start: position after the previous slash
12049 // search for the first slash after the first character
12050 size_t slash = reference_string.find_first_of('/', 1),
12051 // set the beginning of the first reference token
12053 // we can stop if start == string::npos+1 = 0
12055 // set the beginning of the next reference token
12056 // (will eventually be 0 if slash == std::string::npos)
12059 slash = reference_string.find_first_of('/', start))
12061 // use the text between the beginning of the reference token
12062 // (start) and the last slash (slash).
12063 auto reference_token = reference_string.substr(start, slash - start);
12065 // check reference tokens are properly escaped
12066 for (size_t pos = reference_token.find_first_of('~');
12067 pos != std::string::npos;
12068 pos = reference_token.find_first_of('~', pos + 1))
12070 assert(reference_token[pos] == '~');
12072 // ~ must be followed by 0 or 1
12073 if (pos == reference_token.size() - 1 or
12074 (reference_token[pos + 1] != '0' and
12075 reference_token[pos + 1] != '1'))
12077 JSON_THROW(std::domain_error("escape error: '~' must be followed with '0' or '1'"));
12081 // finally, store the reference token
12082 unescape(reference_token);
12083 result.push_back(reference_token);
12091 @brief replace all occurrences of a substring by another string
12093 @param[in,out] s the string to manipulate; changed so that all
12094 occurrences of @a f are replaced with @a t
12095 @param[in] f the substring to replace with @a t
12096 @param[in] t the string to replace @a f
12098 @pre The search string @a f must not be empty.
12100 @since version 2.0.0
12102 static void replace_substring(std::string& s,
12103 const std::string& f,
12104 const std::string& t)
12106 assert(not f.empty());
12109 size_t pos = s.find(f); // find first occurrence of f
12110 pos != std::string::npos; // make sure f was found
12111 s.replace(pos, f.size(), t), // replace with t
12112 pos = s.find(f, pos + t.size()) // find next occurrence of f
12116 /// escape tilde and slash
12117 static std::string escape(std::string s)
12119 // escape "~"" to "~0" and "/" to "~1"
12120 replace_substring(s, "~", "~0");
12121 replace_substring(s, "/", "~1");
12125 /// unescape tilde and slash
12126 static void unescape(std::string& s)
12128 // first transform any occurrence of the sequence '~1' to '/'
12129 replace_substring(s, "~1", "/");
12130 // then transform any occurrence of the sequence '~0' to '~'
12131 replace_substring(s, "~0", "~");
12135 @param[in] reference_string the reference string to the current value
12136 @param[in] value the value to consider
12137 @param[in,out] result the result object to insert values to
12139 @note Empty objects or arrays are flattened to `null`.
12141 static void flatten(const std::string& reference_string,
12142 const basic_json& value,
12143 basic_json& result)
12145 switch (value.m_type)
12147 case value_t::array:
12149 if (value.m_value.array->empty())
12151 // flatten empty array as null
12152 result[reference_string] = nullptr;
12156 // iterate array and use index as reference string
12157 for (size_t i = 0; i < value.m_value.array->size(); ++i)
12159 flatten(reference_string + "/" + std::to_string(i),
12160 value.m_value.array->operator[](i), result);
12166 case value_t::object:
12168 if (value.m_value.object->empty())
12170 // flatten empty object as null
12171 result[reference_string] = nullptr;
12175 // iterate object and use keys as reference string
12176 for (const auto& element : *value.m_value.object)
12178 flatten(reference_string + "/" + escape(element.first),
12179 element.second, result);
12187 // add primitive value with its reference string
12188 result[reference_string] = value;
12195 @param[in] value flattened JSON
12197 @return unflattened JSON
12199 static basic_json unflatten(const basic_json& value)
12201 if (not value.is_object())
12203 JSON_THROW(std::domain_error("only objects can be unflattened"));
12208 // iterate the JSON object values
12209 for (const auto& element : *value.m_value.object)
12211 if (not element.second.is_primitive())
12213 JSON_THROW(std::domain_error("values in object must be primitive"));
12216 // assign value to reference pointed to by JSON pointer; Note
12217 // that if the JSON pointer is "" (i.e., points to the whole
12218 // value), function get_and_create returns a reference to
12219 // result itself. An assignment will then create a primitive
12221 json_pointer(element.first).get_and_create(result) = element.second;
12228 friend bool operator==(json_pointer const& lhs,
12229 json_pointer const& rhs) noexcept
12231 return lhs.reference_tokens == rhs.reference_tokens;
12234 friend bool operator!=(json_pointer const& lhs,
12235 json_pointer const& rhs) noexcept
12237 return !(lhs == rhs);
12240 /// the reference tokens
12241 std::vector<std::string> reference_tokens {};
12244 //////////////////////////
12245 // JSON Pointer support //
12246 //////////////////////////
12248 /// @name JSON Pointer functions
12252 @brief access specified element via JSON Pointer
12254 Uses a JSON pointer to retrieve a reference to the respective JSON value.
12255 No bound checking is performed. Similar to @ref operator[](const typename
12256 object_t::key_type&), `null` values are created in arrays and objects if
12260 - If the JSON pointer points to an object key that does not exist, it
12261 is created an filled with a `null` value before a reference to it
12263 - If the JSON pointer points to an array index that does not exist, it
12264 is created an filled with a `null` value before a reference to it
12265 is returned. All indices between the current maximum and the given
12266 index are also filled with `null`.
12267 - The special value `-` is treated as a synonym for the index past the
12270 @param[in] ptr a JSON pointer
12272 @return reference to the element pointed to by @a ptr
12274 @complexity Constant.
12276 @throw std::out_of_range if the JSON pointer can not be resolved
12277 @throw std::domain_error if an array index begins with '0'
12278 @throw std::invalid_argument if an array index was not a number
12280 @liveexample{The behavior is shown in the example.,operatorjson_pointer}
12282 @since version 2.0.0
12284 reference operator[](const json_pointer& ptr)
12286 return ptr.get_unchecked(this);
12290 @brief access specified element via JSON Pointer
12292 Uses a JSON pointer to retrieve a reference to the respective JSON value.
12293 No bound checking is performed. The function does not change the JSON
12294 value; no `null` values are created. In particular, the the special value
12295 `-` yields an exception.
12297 @param[in] ptr JSON pointer to the desired element
12299 @return const reference to the element pointed to by @a ptr
12301 @complexity Constant.
12303 @throw std::out_of_range if the JSON pointer can not be resolved
12304 @throw std::domain_error if an array index begins with '0'
12305 @throw std::invalid_argument if an array index was not a number
12307 @liveexample{The behavior is shown in the example.,operatorjson_pointer_const}
12309 @since version 2.0.0
12311 const_reference operator[](const json_pointer& ptr) const
12313 return ptr.get_unchecked(this);
12317 @brief access specified element via JSON Pointer
12319 Returns a reference to the element at with specified JSON pointer @a ptr,
12320 with bounds checking.
12322 @param[in] ptr JSON pointer to the desired element
12324 @return reference to the element pointed to by @a ptr
12326 @complexity Constant.
12328 @throw std::out_of_range if the JSON pointer can not be resolved
12329 @throw std::domain_error if an array index begins with '0'
12330 @throw std::invalid_argument if an array index was not a number
12332 @liveexample{The behavior is shown in the example.,at_json_pointer}
12334 @since version 2.0.0
12336 reference at(const json_pointer& ptr)
12338 return ptr.get_checked(this);
12342 @brief access specified element via JSON Pointer
12344 Returns a const reference to the element at with specified JSON pointer @a
12345 ptr, with bounds checking.
12347 @param[in] ptr JSON pointer to the desired element
12349 @return reference to the element pointed to by @a ptr
12351 @complexity Constant.
12353 @throw std::out_of_range if the JSON pointer can not be resolved
12354 @throw std::domain_error if an array index begins with '0'
12355 @throw std::invalid_argument if an array index was not a number
12357 @liveexample{The behavior is shown in the example.,at_json_pointer_const}
12359 @since version 2.0.0
12361 const_reference at(const json_pointer& ptr) const
12363 return ptr.get_checked(this);
12367 @brief return flattened JSON value
12369 The function creates a JSON object whose keys are JSON pointers (see [RFC
12370 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all
12371 primitive. The original JSON value can be restored using the @ref
12372 unflatten() function.
12374 @return an object that maps JSON pointers to primitive values
12376 @note Empty objects and arrays are flattened to `null` and will not be
12377 reconstructed correctly by the @ref unflatten() function.
12379 @complexity Linear in the size the JSON value.
12381 @liveexample{The following code shows how a JSON object is flattened to an
12382 object whose keys consist of JSON pointers.,flatten}
12384 @sa @ref unflatten() for the reverse function
12386 @since version 2.0.0
12388 basic_json flatten() const
12390 basic_json result(value_t::object);
12391 json_pointer::flatten("", *this, result);
12396 @brief unflatten a previously flattened JSON value
12398 The function restores the arbitrary nesting of a JSON value that has been
12399 flattened before using the @ref flatten() function. The JSON value must
12400 meet certain constraints:
12401 1. The value must be an object.
12402 2. The keys must be JSON pointers (see
12403 [RFC 6901](https://tools.ietf.org/html/rfc6901))
12404 3. The mapped values must be primitive JSON types.
12406 @return the original JSON from a flattened version
12408 @note Empty objects and arrays are flattened by @ref flatten() to `null`
12409 values and can not unflattened to their original type. Apart from
12410 this example, for a JSON value `j`, the following is always true:
12411 `j == j.flatten().unflatten()`.
12413 @complexity Linear in the size the JSON value.
12415 @liveexample{The following code shows how a flattened JSON object is
12416 unflattened into the original nested JSON object.,unflatten}
12418 @sa @ref flatten() for the reverse function
12420 @since version 2.0.0
12422 basic_json unflatten() const
12424 return json_pointer::unflatten(*this);
12429 //////////////////////////
12430 // JSON Patch functions //
12431 //////////////////////////
12433 /// @name JSON Patch functions
12437 @brief applies a JSON patch
12439 [JSON Patch](http://jsonpatch.com) defines a JSON document structure for
12440 expressing a sequence of operations to apply to a JSON) document. With
12441 this function, a JSON Patch is applied to the current JSON value by
12442 executing all operations from the patch.
12444 @param[in] json_patch JSON patch document
12445 @return patched document
12447 @note The application of a patch is atomic: Either all operations succeed
12448 and the patched document is returned or an exception is thrown. In
12449 any case, the original value is not changed: the patch is applied
12450 to a copy of the value.
12452 @throw std::out_of_range if a JSON pointer inside the patch could not
12453 be resolved successfully in the current JSON value; example: `"key baz
12455 @throw invalid_argument if the JSON patch is malformed (e.g., mandatory
12456 attributes are missing); example: `"operation add must have member path"`
12458 @complexity Linear in the size of the JSON value and the length of the
12459 JSON patch. As usually only a fraction of the JSON value is affected by
12460 the patch, the complexity can usually be neglected.
12462 @liveexample{The following code shows how a JSON patch is applied to a
12465 @sa @ref diff -- create a JSON patch by comparing two JSON values
12467 @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)
12468 @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901)
12470 @since version 2.0.0
12472 basic_json patch(const basic_json& json_patch) const
12474 // make a working copy to apply the patch to
12475 basic_json result = *this;
12477 // the valid JSON Patch operations
12478 enum class patch_operations {add, remove, replace, move, copy, test, invalid};
12480 const auto get_op = [](const std::string op)
12484 return patch_operations::add;
12486 if (op == "remove")
12488 return patch_operations::remove;
12490 if (op == "replace")
12492 return patch_operations::replace;
12496 return patch_operations::move;
12500 return patch_operations::copy;
12504 return patch_operations::test;
12507 return patch_operations::invalid;
12510 // wrapper for "add" operation; add value at ptr
12511 const auto operation_add = [&result](json_pointer & ptr, basic_json val)
12513 // adding to the root of the target document means replacing it
12520 // make sure the top element of the pointer exists
12521 json_pointer top_pointer = ptr.top();
12522 if (top_pointer != ptr)
12524 result.at(top_pointer);
12527 // get reference to parent of JSON pointer ptr
12528 const auto last_path = ptr.pop_back();
12529 basic_json& parent = result[ptr];
12531 switch (parent.m_type)
12533 case value_t::null:
12534 case value_t::object:
12536 // use operator[] to add value
12537 parent[last_path] = val;
12541 case value_t::array:
12543 if (last_path == "-")
12545 // special case: append to back
12546 parent.push_back(val);
12550 const auto idx = std::stoi(last_path);
12551 if (static_cast<size_type>(idx) > parent.size())
12553 // avoid undefined behavior
12554 JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range"));
12558 // default case: insert add offset
12559 parent.insert(parent.begin() + static_cast<difference_type>(idx), val);
12567 // if there exists a parent it cannot be primitive
12568 assert(false); // LCOV_EXCL_LINE
12574 // wrapper for "remove" operation; remove value at ptr
12575 const auto operation_remove = [&result](json_pointer & ptr)
12577 // get reference to parent of JSON pointer ptr
12578 const auto last_path = ptr.pop_back();
12579 basic_json& parent = result.at(ptr);
12582 if (parent.is_object())
12584 // perform range check
12585 auto it = parent.find(last_path);
12586 if (it != parent.end())
12592 JSON_THROW(std::out_of_range("key '" + last_path + "' not found"));
12595 else if (parent.is_array())
12597 // note erase performs range check
12598 parent.erase(static_cast<size_type>(std::stoi(last_path)));
12603 if (not json_patch.is_array())
12605 // a JSON patch must be an array of objects
12606 JSON_THROW(std::invalid_argument("JSON patch must be an array of objects"));
12609 // iterate and apply the operations
12610 for (const auto& val : json_patch)
12612 // wrapper to get a value for an operation
12613 const auto get_value = [&val](const std::string & op,
12614 const std::string & member,
12615 bool string_type) -> basic_json&
12618 auto it = val.m_value.object->find(member);
12620 // context-sensitive error message
12621 const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'";
12623 // check if desired value is present
12624 if (it == val.m_value.object->end())
12626 JSON_THROW(std::invalid_argument(error_msg + " must have member '" + member + "'"));
12629 // check if result is of type string
12630 if (string_type and not it->second.is_string())
12632 JSON_THROW(std::invalid_argument(error_msg + " must have string member '" + member + "'"));
12635 // no error: return value
12640 if (not val.is_object())
12642 JSON_THROW(std::invalid_argument("JSON patch must be an array of objects"));
12645 // collect mandatory members
12646 const std::string op = get_value("op", "op", true);
12647 const std::string path = get_value(op, "path", true);
12648 json_pointer ptr(path);
12650 switch (get_op(op))
12652 case patch_operations::add:
12654 operation_add(ptr, get_value("add", "value", false));
12658 case patch_operations::remove:
12660 operation_remove(ptr);
12664 case patch_operations::replace:
12666 // the "path" location must exist - use at()
12667 result.at(ptr) = get_value("replace", "value", false);
12671 case patch_operations::move:
12673 const std::string from_path = get_value("move", "from", true);
12674 json_pointer from_ptr(from_path);
12676 // the "from" location must exist - use at()
12677 basic_json v = result.at(from_ptr);
12679 // The move operation is functionally identical to a
12680 // "remove" operation on the "from" location, followed
12681 // immediately by an "add" operation at the target
12682 // location with the value that was just removed.
12683 operation_remove(from_ptr);
12684 operation_add(ptr, v);
12688 case patch_operations::copy:
12690 const std::string from_path = get_value("copy", "from", true);;
12691 const json_pointer from_ptr(from_path);
12693 // the "from" location must exist - use at()
12694 result[ptr] = result.at(from_ptr);
12698 case patch_operations::test:
12700 bool success = false;
12703 // check if "value" matches the one at "path"
12704 // the "path" location must exist - use at()
12705 success = (result.at(ptr) == get_value("test", "value", false));
12707 JSON_CATCH (std::out_of_range&)
12709 // ignore out of range errors: success remains false
12712 // throw an exception if test fails
12715 JSON_THROW(std::domain_error("unsuccessful: " + val.dump()));
12721 case patch_operations::invalid:
12723 // op must be "add", "remove", "replace", "move", "copy", or
12725 JSON_THROW(std::invalid_argument("operation value '" + op + "' is invalid"));
12734 @brief creates a diff as a JSON patch
12736 Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can
12737 be changed into the value @a target by calling @ref patch function.
12739 @invariant For two JSON values @a source and @a target, the following code
12740 yields always `true`:
12742 source.patch(diff(source, target)) == target;
12745 @note Currently, only `remove`, `add`, and `replace` operations are
12748 @param[in] source JSON value to compare from
12749 @param[in] target JSON value to compare against
12750 @param[in] path helper value to create JSON pointers
12752 @return a JSON patch to convert the @a source to @a target
12754 @complexity Linear in the lengths of @a source and @a target.
12756 @liveexample{The following code shows how a JSON patch is created as a
12757 diff for two JSON values.,diff}
12759 @sa @ref patch -- apply a JSON patch
12761 @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)
12763 @since version 2.0.0
12765 static basic_json diff(const basic_json& source,
12766 const basic_json& target,
12767 const std::string& path = "")
12770 basic_json result(value_t::array);
12772 // if the values are the same, return empty patch
12773 if (source == target)
12778 if (source.type() != target.type())
12780 // different types: replace value
12790 switch (source.type())
12792 case value_t::array:
12794 // first pass: traverse common elements
12796 while (i < source.size() and i < target.size())
12798 // recursive call to compare array values at index i
12799 auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i));
12800 result.insert(result.end(), temp_diff.begin(), temp_diff.end());
12804 // i now reached the end of at least one array
12805 // in a second pass, traverse the remaining elements
12807 // remove my remaining elements
12808 const auto end_index = static_cast<difference_type>(result.size());
12809 while (i < source.size())
12811 // add operations in reverse order to avoid invalid
12813 result.insert(result.begin() + end_index, object(
12816 {"path", path + "/" + std::to_string(i)}
12821 // add other remaining elements
12822 while (i < target.size())
12827 {"path", path + "/" + std::to_string(i)},
12828 {"value", target[i]}
12836 case value_t::object:
12838 // first pass: traverse this object's elements
12839 for (auto it = source.begin(); it != source.end(); ++it)
12841 // escape the key name to be used in a JSON patch
12842 const auto key = json_pointer::escape(it.key());
12844 if (target.find(it.key()) != target.end())
12846 // recursive call to compare object values at key it
12847 auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key);
12848 result.insert(result.end(), temp_diff.begin(), temp_diff.end());
12852 // found a key that is not in o -> remove it
12853 result.push_back(object(
12856 {"path", path + "/" + key}
12861 // second pass: traverse other object's elements
12862 for (auto it = target.begin(); it != target.end(); ++it)
12864 if (source.find(it.key()) == source.end())
12866 // found a key that is not in this -> add it
12867 const auto key = json_pointer::escape(it.key());
12871 {"path", path + "/" + key},
12872 {"value", it.value()}
12882 // both primitive type: replace value
12905 @brief default JSON class
12907 This type is the default specialization of the @ref basic_json class which
12908 uses the standard template types.
12910 @since version 1.0.0
12912 using json = basic_json<>;
12913 } // namespace nlohmann
12916 ///////////////////////
12917 // nonmember support //
12918 ///////////////////////
12920 // specialization of std::swap, and std::hash
12924 @brief exchanges the values of two JSON objects
12926 @since version 1.0.0
12929 inline void swap(nlohmann::json& j1,
12930 nlohmann::json& j2) noexcept(
12931 is_nothrow_move_constructible<nlohmann::json>::value and
12932 is_nothrow_move_assignable<nlohmann::json>::value
12938 /// hash value for JSON objects
12940 struct hash<nlohmann::json>
12943 @brief return a hash value for a JSON object
12945 @since version 1.0.0
12947 std::size_t operator()(const nlohmann::json& j) const
12949 // a naive hashing via the string representation
12950 const auto& h = hash<nlohmann::json::string_t>();
12951 return h(j.dump());
12957 @brief user-defined string literal for JSON values
12959 This operator implements a user-defined string literal for JSON objects. It
12960 can be used by adding `"_json"` to a string literal and returns a JSON object
12961 if no parse error occurred.
12963 @param[in] s a string representation of a JSON object
12964 @param[in] n the length of string @a s
12965 @return a JSON object
12967 @since version 1.0.0
12969 inline nlohmann::json operator "" _json(const char* s, std::size_t n)
12971 return nlohmann::json::parse(s, s + n);
12975 @brief user-defined string literal for JSON pointer
12977 This operator implements a user-defined string literal for JSON Pointers. It
12978 can be used by adding `"_json_pointer"` to a string literal and returns a JSON pointer
12979 object if no parse error occurred.
12981 @param[in] s a string representation of a JSON Pointer
12982 @param[in] n the length of string @a s
12983 @return a JSON pointer object
12985 @since version 2.0.0
12987 inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n)
12989 return nlohmann::json::json_pointer(std::string(s, n));
12992 // restore GCC/clang diagnostic settings
12993 #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
12994 #pragma GCC diagnostic pop
12999 #undef JSON_DEPRECATED