#pragma once #include #include // partial specialization (full specialization works too) namespace nlohmann { template struct adl_serializer> { static void to_json(json& j, const std::optional& opt) { if (!opt.has_value()) { j = nullptr; } else { j = *opt; // this will call adl_serializer::to_json which will // find the free function to_json in T's namespace! } } static void from_json(const json& j, std::optional& opt) { if (j.is_null()) { opt = std::nullopt; } else { opt = j.template get(); // same as above, but with // adl_serializer::from_json } } }; } // namespace nlohmann