nlohmann json是一个star很高的C++ json解析库。
要让nlohmann json支持某个类型T,只要给这个类型T实现一个偏特化的struct adl_serializer<T>即可。adl_serializer是这个库里面针对泛型T预定义的适配器。
而嵌套结构,本身就支持的。使用预定义的宏NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE,可以免去自己针对每个类型T要实现其from_json/to_json函数。
下面是一个例子,适用于VC++。里面UTF-8和UTF-16的转换可以自行换成其他的实现方式。
#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING #include <string> #include <codecvt> #include <locale> #include <nlohmann/json.hpp> using json = nlohmann::json; namespace nlohmann { template <> struct adl_serializer<std::wstring> { static void to_json(json& j, const std::wstring& str) { std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; j = converter.to_bytes(str); } static void from_json(const json& j, std::wstring& str) { std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; str = converter.from_bytes(j.get<std::string>()); } }; } namespace ns { struct Address { std::wstring country; std::wstring province; std::wstring city; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Address, country, province, city) struct Person { std::wstring name; Address address; int age; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Person, name, address, age) } int main(int argc, char* argv[], char* envp) { ns::Person p{ L"匿名", { L"中国", L"湖北", L"武汉" }, 60 }; json j = p; const auto s = j.dump(); auto p2 = j.template get<ns::Person>(); return 0; }
标签:std,struct,wstring,nlohmann,json,序列化 From: https://www.cnblogs.com/z16166/p/17599934.html