Skip to content

Commit bdb8d2b

Browse files
authored
Serialize empty tuple into '[]' instead of null (#4594)
Signed-off-by: Michael Valladolid <[email protected]>
1 parent e72046e commit bdb8d2b

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-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: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5190,6 +5190,12 @@ std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, index_sequence<
51905190
return std::make_tuple(std::forward<BasicJsonType>(j).at(Idx).template get<Args>()...);
51915191
}
51925192

5193+
template<typename BasicJsonType>
5194+
std::tuple<> from_json_tuple_impl_base(BasicJsonType& /*unused*/, index_sequence<> /*unused*/)
5195+
{
5196+
return {};
5197+
}
5198+
51935199
template < typename BasicJsonType, class A1, class A2 >
51945200
std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::pair<A1, A2>> /*unused*/, priority_tag<0> /*unused*/)
51955201
{
@@ -6019,6 +6025,13 @@ inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<
60196025
j = { std::get<Idx>(t)... };
60206026
}
60216027

6028+
template<typename BasicJsonType, typename Tuple>
6029+
inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& /*unused*/, index_sequence<> /*unused*/)
6030+
{
6031+
using array_t = typename BasicJsonType::array_t;
6032+
j = array_t();
6033+
}
6034+
60226035
template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>
60236036
inline void to_json(BasicJsonType& j, const T& t)
60246037
{

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)