11#include <nlohmann/detail/macro_scope.hpp>
26#include <nlohmann/detail/iterators/iteration_proxy.hpp>
27#include <nlohmann/detail/meta/cpp_future.hpp>
28#include <nlohmann/detail/meta/std_fs.hpp>
29#include <nlohmann/detail/meta/type_traits.hpp>
30#include <nlohmann/detail/value_t.hpp>
32NLOHMANN_JSON_NAMESPACE_BEGIN
52 template<
typename BasicJsonType>
53 static void construct(BasicJsonType& j,
typename BasicJsonType::boolean_t b)
noexcept
55 j.m_data.m_value.destroy(j.m_data.m_type);
65 template<
typename BasicJsonType>
66 static void construct(BasicJsonType& j,
const typename BasicJsonType::string_t& s)
68 j.m_data.m_value.destroy(j.m_data.m_type);
74 template<
typename BasicJsonType>
75 static void construct(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
77 j.m_data.m_value.destroy(j.m_data.m_type);
79 j.m_data.m_value = std::move(s);
83 template <
typename BasicJsonType,
typename CompatibleStringType,
84 enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,
86 static void construct(BasicJsonType& j,
const CompatibleStringType& str)
88 j.m_data.m_value.destroy(j.m_data.m_type);
90 j.m_data.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
98 template<
typename BasicJsonType>
99 static void construct(BasicJsonType& j,
const typename BasicJsonType::binary_t& b)
101 j.m_data.m_value.destroy(j.m_data.m_type);
103 j.m_data.m_value =
typename BasicJsonType::binary_t(b);
104 j.assert_invariant();
107 template<
typename BasicJsonType>
108 static void construct(BasicJsonType& j,
typename BasicJsonType::binary_t&& b)
110 j.m_data.m_value.destroy(j.m_data.m_type);
112 j.m_data.m_value =
typename BasicJsonType::binary_t(std::move(b));
113 j.assert_invariant();
120 template<
typename BasicJsonType>
121 static void construct(BasicJsonType& j,
typename BasicJsonType::number_float_t val)
noexcept
123 j.m_data.m_value.destroy(j.m_data.m_type);
125 j.m_data.m_value = val;
126 j.assert_invariant();
133 template<
typename BasicJsonType>
134 static void construct(BasicJsonType& j,
typename BasicJsonType::number_unsigned_t val)
noexcept
136 j.m_data.m_value.destroy(j.m_data.m_type);
138 j.m_data.m_value = val;
139 j.assert_invariant();
146 template<
typename BasicJsonType>
147 static void construct(BasicJsonType& j,
typename BasicJsonType::number_integer_t val)
noexcept
149 j.m_data.m_value.destroy(j.m_data.m_type);
151 j.m_data.m_value = val;
152 j.assert_invariant();
159 template<
typename BasicJsonType>
160 static void construct(BasicJsonType& j,
const typename BasicJsonType::array_t& arr)
162 j.m_data.m_value.destroy(j.m_data.m_type);
164 j.m_data.m_value = arr;
166 j.assert_invariant();
169 template<
typename BasicJsonType>
170 static void construct(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
172 j.m_data.m_value.destroy(j.m_data.m_type);
174 j.m_data.m_value = std::move(arr);
176 j.assert_invariant();
179 template <
typename BasicJsonType,
typename CompatibleArrayType,
180 enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
182 static void construct(BasicJsonType& j,
const CompatibleArrayType& arr)
187 j.m_data.m_value.destroy(j.m_data.m_type);
189 j.m_data.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
191 j.assert_invariant();
194 template<
typename BasicJsonType>
195 static void construct(BasicJsonType& j,
const std::vector<bool>& arr)
197 j.m_data.m_value.destroy(j.m_data.m_type);
200 j.m_data.m_value.array->reserve(arr.size());
201 for (
const bool x : arr)
203 j.m_data.m_value.array->push_back(x);
204 j.set_parent(j.m_data.m_value.array->back());
206 j.assert_invariant();
209 template<
typename BasicJsonType,
typename T,
210 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
211 static void construct(BasicJsonType& j,
const std::valarray<T>& arr)
213 j.m_data.m_value.destroy(j.m_data.m_type);
216 j.m_data.m_value.array->resize(arr.size());
219 std::copy(std::begin(arr), std::end(arr), j.m_data.m_value.array->begin());
222 j.assert_invariant();
229 template<
typename BasicJsonType>
230 static void construct(BasicJsonType& j,
const typename BasicJsonType::object_t& obj)
232 j.m_data.m_value.destroy(j.m_data.m_type);
234 j.m_data.m_value = obj;
236 j.assert_invariant();
239 template<
typename BasicJsonType>
240 static void construct(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
242 j.m_data.m_value.destroy(j.m_data.m_type);
244 j.m_data.m_value = std::move(obj);
246 j.assert_invariant();
249 template <
typename BasicJsonType,
typename CompatibleObjectType,
250 enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value,
int > = 0 >
251 static void construct(BasicJsonType& j,
const CompatibleObjectType& obj)
256 j.m_data.m_value.destroy(j.m_data.m_type);
258 j.m_data.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
260 j.assert_invariant();
268#ifdef JSON_HAS_CPP_17
269template<
typename BasicJsonType,
typename T,
270 enable_if_t<std::is_constructible<BasicJsonType, T>::value,
int> = 0>
271void to_json(BasicJsonType& j,
const std::optional<T>& opt)
noexcept
284template<
typename BasicJsonType,
typename T,
285 enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value,
int> = 0>
286inline void to_json(BasicJsonType& j, T b)
noexcept
291template <
typename BasicJsonType,
typename BoolRef,
293 ((std::is_same<std::vector<bool>::reference, BoolRef>::value
294 && !std::is_same <std::vector<bool>::reference,
typename BasicJsonType::boolean_t&>::value)
295 || (std::is_same<std::vector<bool>::const_reference, BoolRef>::value
296 && !std::is_same <detail::uncvref_t<std::vector<bool>::const_reference>,
297 typename BasicJsonType::boolean_t >::value))
298 && std::is_convertible<const BoolRef&, typename BasicJsonType::boolean_t>::value,
int > = 0 >
299inline void to_json(BasicJsonType& j,
const BoolRef& b)
noexcept
304template<
typename BasicJsonType,
typename CompatibleString,
305 enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value,
int> = 0>
306inline void to_json(BasicJsonType& j,
const CompatibleString& s)
311template<
typename BasicJsonType>
312inline void to_json(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
317template<
typename BasicJsonType,
typename FloatType,
318 enable_if_t<std::is_floating_point<FloatType>::value,
int> = 0>
319inline void to_json(BasicJsonType& j, FloatType val)
noexcept
324template<
typename BasicJsonType,
typename CompatibleNumberUnsignedType,
325 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value,
int> = 0>
326inline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val)
noexcept
331template<
typename BasicJsonType,
typename CompatibleNumberIntegerType,
332 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value,
int> = 0>
333inline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val)
noexcept
338#if !JSON_DISABLE_ENUM_SERIALIZATION
339template<
typename BasicJsonType,
typename EnumType,
340 enable_if_t<std::is_enum<EnumType>::value,
int> = 0>
341inline void to_json(BasicJsonType& j, EnumType e)
noexcept
343 using underlying_type =
typename std::underlying_type<EnumType>::type;
349template<
typename BasicJsonType>
350inline void to_json(BasicJsonType& j,
const std::vector<bool>& e)
355template <
typename BasicJsonType,
typename CompatibleArrayType,
357 CompatibleArrayType>::value&&
359 !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&&
360 !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&&
363inline void to_json(BasicJsonType& j,
const CompatibleArrayType& arr)
368template<
typename BasicJsonType>
369inline void to_json(BasicJsonType& j,
const typename BasicJsonType::binary_t& bin)
374template<
typename BasicJsonType,
typename T,
375 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
376inline void to_json(BasicJsonType& j,
const std::valarray<T>& arr)
381template<
typename BasicJsonType>
382inline void to_json(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
387template <
typename BasicJsonType,
typename CompatibleObjectType,
389inline void to_json(BasicJsonType& j,
const CompatibleObjectType& obj)
394template<
typename BasicJsonType>
395inline void to_json(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
401 typename BasicJsonType,
typename T, std::size_t N,
402 enable_if_t < !std::is_constructible<
typename BasicJsonType::string_t,
403 const T(&)[N]>::value,
405inline void to_json(BasicJsonType& j,
const T(&arr)[N])
410template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value,
int > = 0 >
411inline void to_json(BasicJsonType& j,
const std::pair<T1, T2>& p)
413 j = { p.first, p.second };
417template<
typename BasicJsonType,
typename T,
418 enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value,
int> = 0>
419inline void to_json(BasicJsonType& j,
const T& b)
421 j = { {b.key(), b.value()} };
424template<
typename BasicJsonType,
typename Tuple, std::size_t... Idx>
425inline void to_json_tuple_impl(BasicJsonType& j,
const Tuple& t, index_sequence<Idx...> )
427 j = { std::get<Idx>(t)... };
430template<
typename BasicJsonType,
typename Tuple>
431inline void to_json_tuple_impl(BasicJsonType& j,
const Tuple& , index_sequence<> )
433 using array_t =
typename BasicJsonType::array_t;
437template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value,
int > = 0>
438inline void to_json(BasicJsonType& j,
const T& t)
440 to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});
443#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
444#if defined(__cpp_lib_char8_t)
445template<
typename BasicJsonType,
typename Tr,
typename Allocator>
446inline void to_json(BasicJsonType& j,
const std::basic_string<char8_t, Tr, Allocator>& s)
448 using OtherAllocator =
typename std::allocator_traits<Allocator>::template rebind_alloc<char>;
449 j = std::basic_string<char, std::char_traits<char>, OtherAllocator>(s.begin(), s.end(), s.get_allocator());
453template<
typename BasicJsonType>
454inline void to_json(BasicJsonType& j,
const std_fs::path& p)
464 template<
typename BasicJsonType,
typename T>
465 auto operator()(BasicJsonType& j, T&& val)
const noexcept(
noexcept(to_json(j, std::forward<T>(val))))
466 ->
decltype(to_json(j, std::forward<T>(val)),
void())
468 return to_json(j, std::forward<T>(val));
473#ifndef JSON_HAS_CPP_17
480JSON_INLINE_VARIABLE
constexpr const auto& to_json =
481 detail::static_const<detail::to_json_fn>::value;
482#ifndef JSON_HAS_CPP_17
486NLOHMANN_JSON_NAMESPACE_END
detail namespace with internal helper functions
定义 from_json.hpp:43
value_t
the JSON type enumeration
定义 value_t.hpp:54
@ number_integer
number value (signed integer)
定义 value_t.hpp:60
@ boolean
boolean value
定义 value_t.hpp:59
@ binary
binary array (ordered collection of bytes)
定义 value_t.hpp:63
@ object
object (unordered set of name/value pairs)
定义 value_t.hpp:56
@ string
string value
定义 value_t.hpp:58
@ number_float
number value (floating-point)
定义 value_t.hpp:62
@ number_unsigned
number value (unsigned integer)
定义 value_t.hpp:61
@ array
array (ordered collection of values)
定义 value_t.hpp:57