diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index bb049aa8..08a841b4 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -157,6 +157,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l) std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l)); } +template <typename BasicJsonType, typename T, std::size_t N> +auto from_json(const BasicJsonType& j, T (&arr)[N]) +-> decltype(j.template get<T>(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get<T>(); + } +} + template<typename BasicJsonType> void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) { diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index b9558a93..017ce929 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -2684,6 +2684,19 @@ class basic_json return v; } + template < + typename T, std::size_t N, + typename Array = T (&)[N], + detail::enable_if_t < + detail::has_from_json<basic_json_t, Array>::value, int > = 0 > + Array get_to(T (&v)[N]) const + noexcept(noexcept(JSONSerializer<Array>::from_json( + std::declval<const basic_json_t&>(), v))) + { + JSONSerializer<Array>::from_json(*this, v); + return v; + } + /*! @brief get a pointer value (implicit) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 240b08f2..1f82da44 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1445,6 +1445,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l) std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l)); } +template <typename BasicJsonType, typename T, std::size_t N> +auto from_json(const BasicJsonType& j, T (&arr)[N]) +-> decltype(j.template get<T>(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get<T>(); + } +} + template<typename BasicJsonType> void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) { @@ -15475,6 +15485,19 @@ class basic_json return v; } + template < + typename T, std::size_t N, + typename Array = T (&)[N], + detail::enable_if_t < + detail::has_from_json<basic_json_t, Array>::value, int > = 0 > + Array get_to(T (&v)[N]) const + noexcept(noexcept(JSONSerializer<Array>::from_json( + std::declval<const basic_json_t&>(), v))) + { + JSONSerializer<Array>::from_json(*this, v); + return v; + } + /*! @brief get a pointer value (implicit) diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 800dded1..c81720d2 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -386,6 +386,16 @@ TEST_CASE("value conversion") CHECK(json(a) == j); } + SECTION("built-in arrays") + { + const int nbs[] = {0, 1, 2}; + int nbs2[] = {0, 0, 0}; + + json j2 = nbs; + j2.get_to(nbs2); + CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2))); + } + SECTION("std::deque<json>") { std::deque<json> a{"previous", "value"};