Skip to content

Commit 0b995ce

Browse files
committed
Serialize empty tuple into '[]' instead of null
Signed-off-by: Michael Valladolid <[email protected]>
1 parent ad2ee18 commit 0b995ce

File tree

4 files changed

+29
-0
lines changed

4 files changed

+29
-0
lines changed

include/nlohmann/detail/conversions/from_json.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,12 @@ std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, index_sequence<
448448
return std::make_tuple(std::forward<BasicJsonType>(j).at(Idx).template get<Args>()...);
449449
}
450450

451+
template<typename BasicJsonType>
452+
std::tuple<> from_json_tuple_impl_base(BasicJsonType& /*unused*/, index_sequence<> /*unused*/)
453+
{
454+
return {};
455+
}
456+
451457
template < typename BasicJsonType, class A1, class A2 >
452458
std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::pair<A1, A2>> /*unused*/, priority_tag<0> /*unused*/)
453459
{

include/nlohmann/detail/conversions/to_json.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,13 @@ inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<
426426
j = { std::get<Idx>(t)... };
427427
}
428428

429+
template<typename BasicJsonType, typename Tuple>
430+
inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& /*unused*/, index_sequence<> /*unused*/)
431+
{
432+
using array_t = typename BasicJsonType::array_t;
433+
j = array_t();
434+
}
435+
429436
template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>
430437
inline void to_json(BasicJsonType& j, const T& t)
431438
{

single_include/nlohmann/json.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5987,6 +5987,13 @@ inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<
59875987
j = { std::get<Idx>(t)... };
59885988
}
59895989

5990+
template<typename BasicJsonType, typename Tuple>
5991+
inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& /*unused*/, index_sequence<> /*unused*/)
5992+
{
5993+
using array_t = typename BasicJsonType::array_t;
5994+
j = array_t();
5995+
}
5996+
59905997
template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>
59915998
inline void to_json(BasicJsonType& j, const T& t)
59925999
{

tests/src/unit-regression2.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,15 @@ TEST_CASE("regression tests 2")
814814
}
815815
}
816816

817+
SECTION("issue #4530 - Serialization of empty tuple")
818+
{
819+
const auto source_tuple = std::tuple<>();
820+
const nlohmann::json j = source_tuple;
821+
822+
CHECK(j.get<decltype(source_tuple)>() == source_tuple);
823+
CHECK("[]" == j.dump());
824+
}
825+
817826
SECTION("issue #2865 - ASAN detects memory leaks")
818827
{
819828
// the code below is expected to not leak memory

0 commit comments

Comments
 (0)