diff --git a/include/glaze/json/write.hpp b/include/glaze/json/write.hpp index e1057b3115..6770ca8a93 100644 --- a/include/glaze/json/write.hpp +++ b/include/glaze/json/write.hpp @@ -1363,14 +1363,26 @@ namespace glz using WriterType = meta_unknown_write_t; if constexpr (std::is_member_object_pointer_v) { - // TODO: This intermediate is added to get GCC 14 to build - decltype(auto) merged = glz::merge{value, value.*writer}; - write::op()>(std::move(merged), ctx, b, ix); + decltype(auto) unknown_writer = value.*writer; + if (unknown_writer.size() > 0) { + // TODO: This intermediate is added to get GCC 14 to build + decltype(auto) merged = glz::merge{value, unknown_writer}; + write::op()>(std::move(merged), ctx, b, ix); + } + else { + write::op()>(value, ctx, b, ix); + } } else if constexpr (std::is_member_function_pointer_v) { - // TODO: This intermediate is added to get GCC 14 to build - decltype(auto) merged = glz::merge{value, (value.*writer)()}; - write::op()>(std::move(merged), ctx, b, ix); + decltype(auto) unknown_writer = (value.*writer)(); + if (unknown_writer.size() > 0) { + // TODO: This intermediate is added to get GCC 14 to build + decltype(auto) merged = glz::merge{value, unknown_writer}; + write::op()>(std::move(merged), ctx, b, ix); + } + else { + write::op()>(value, ctx, b, ix); + } } else { static_assert(false_v, "unknown_write type not handled"); diff --git a/tests/json_test/json_test.cpp b/tests/json_test/json_test.cpp index f7037839a5..202d247c54 100644 --- a/tests/json_test/json_test.cpp +++ b/tests/json_test/json_test.cpp @@ -7193,6 +7193,26 @@ struct glz::meta static constexpr auto unknown_read{&T::extra}; }; +struct my_unknown_struct +{ + int i = 287; + std::unordered_map unknown; + +}; + +template <> +struct glz::meta { + using T = my_unknown_struct; + static constexpr auto value = glz::object( + "i", &T::i + ); + + static constexpr auto unknown_write{ &T::unknown }; + //static constexpr auto unknown_read{ + // &T::unknown + //}; +}; + suite unknown_fields_member_test = [] { "decode_unknown"_test = [] { unknown_fields_member obj{}; @@ -7229,6 +7249,18 @@ suite unknown_fields_member_test = [] { expect(not glz::write_json(obj, out)); expect(out == R"({"unk":"zzz","unk2":{"sub":3,"sub2":[{"a":"b"}]},"unk3":[]})") << out; }; + + "my_unknown_struct"_test = [] { + my_unknown_struct obj; + std::string buffer; + expect(not glz::write < glz::opts{ .prettify = true } > (obj, buffer)); + expect(buffer == R"({ + "i": 287 +})") << buffer; + + expect(not glz::write < glz::opts{ } > (obj, buffer)); + expect(buffer == R"({"i":287})") << buffer; + }; }; struct unknown_fields_method