add from_json support for std::array
This commit is contained in:
parent
6e4910d5c5
commit
08d781058c
2 changed files with 16 additions and 3 deletions
11
src/json.hpp
11
src/json.hpp
|
@ -1063,6 +1063,15 @@ auto from_json_array_impl(const BasicJsonType& j, CompatibleArrayType& arr, prio
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename BasicJsonType, typename T, std::size_t N>
|
||||||
|
void from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr, priority_tag<2>)
|
||||||
|
{
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
arr[i] = j.at(i).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename BasicJsonType, typename CompatibleArrayType,
|
template<typename BasicJsonType, typename CompatibleArrayType,
|
||||||
enable_if_t<is_compatible_array_type<BasicJsonType, CompatibleArrayType>::value and
|
enable_if_t<is_compatible_array_type<BasicJsonType, CompatibleArrayType>::value and
|
||||||
std::is_convertible<BasicJsonType, typename CompatibleArrayType::value_type>::value and
|
std::is_convertible<BasicJsonType, typename CompatibleArrayType::value_type>::value and
|
||||||
|
@ -1074,7 +1083,7 @@ void from_json(const BasicJsonType& j, CompatibleArrayType& arr)
|
||||||
JSON_THROW(type_error::create(302, "type must be array, but is " + j.type_name()));
|
JSON_THROW(type_error::create(302, "type must be array, but is " + j.type_name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
from_json_array_impl(j, arr, priority_tag<1> {});
|
from_json_array_impl(j, arr, priority_tag<2> {});
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename BasicJsonType, typename CompatibleObjectType,
|
template<typename BasicJsonType, typename CompatibleObjectType,
|
||||||
|
|
|
@ -283,12 +283,13 @@ TEST_CASE("constructors")
|
||||||
CHECK(std::get<2>(t) == j[2]);
|
CHECK(std::get<2>(t) == j[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::pair/tuple failures")
|
SECTION("std::pair/tuple/array failures")
|
||||||
{
|
{
|
||||||
json j{1};
|
json j{1};
|
||||||
|
|
||||||
CHECK_THROWS((j.get<std::pair<int, int>>()));
|
CHECK_THROWS((j.get<std::pair<int, int>>()));
|
||||||
CHECK_THROWS((j.get<std::tuple<int, int>>()));
|
CHECK_THROWS((j.get<std::tuple<int, int>>()));
|
||||||
|
CHECK_THROWS((j.get<std::array<int, 3>>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::forward_list<json>")
|
SECTION("std::forward_list<json>")
|
||||||
|
@ -299,12 +300,15 @@ TEST_CASE("constructors")
|
||||||
CHECK(j == j_reference);
|
CHECK(j == j_reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::array<json, 5>")
|
SECTION("std::array<json, 6>")
|
||||||
{
|
{
|
||||||
std::array<json, 6> a {{json(1), json(1u), json(2.2), json(false), json("string"), json()}};
|
std::array<json, 6> a {{json(1), json(1u), json(2.2), json(false), json("string"), json()}};
|
||||||
json j(a);
|
json j(a);
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
CHECK(j == j_reference);
|
CHECK(j == j_reference);
|
||||||
|
|
||||||
|
const auto a2 = j.get<std::array<json, 6>>();
|
||||||
|
CHECK(a2 == a);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::vector<json>")
|
SECTION("std::vector<json>")
|
||||||
|
|
Loading…
Reference in a new issue