diff --git a/include/simdjson/generic/ondemand/std_deserialize.h b/include/simdjson/generic/ondemand/std_deserialize.h index a77fc474d..d3570ed31 100644 --- a/include/simdjson/generic/ondemand/std_deserialize.h +++ b/include/simdjson/generic/ondemand/std_deserialize.h @@ -182,6 +182,35 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser return SUCCESS; } +#if SIMDJSON_STATIC_REFLECTION +/* Deserialization of user defined types relying on static reflection */ +template + requires(simdjson::json_builder::user_defined_type) +simdjson_result tag_invoke(deserialize_tag, std::type_identity, + auto &val) { + ondemand::object obj; + auto error = val.get_object().get(obj); + if (error) { + return error; + } + T t; + for (auto keyval : obj) { + std::string_view key; + SIMDJSON_TRY(keyval.escaped_key().get(key)); + [:json_builder::expand(std::meta::nonstatic_data_members_of(^T) + ):] >> [&] { + if (key == std::string_view(std::meta::identifier_of(mem))) { + error = keyval.value().get(t.[:mem:]); + } + }; + if (error) { + return error; + } + } + return t; +} +#endif // SIMDJSON_STATIC_REFLECTION + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H