support deserialize.
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
#include <Support/Reflection.h>
|
||||
@@ -49,7 +48,32 @@ auto serialize(const Object& object) {
|
||||
json.emplace(name, serialize(member));
|
||||
}
|
||||
});
|
||||
return json;
|
||||
return std::move(json);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Object>
|
||||
Object deserialize(const json& json) {
|
||||
if constexpr(std::is_fundamental_v<Object> || std::is_same_v<Object, std::string_view> ||
|
||||
std::is_same_v<Object, std::string>) {
|
||||
return json.get<Object>();
|
||||
} else if constexpr(impl::is_vector_like_v<Object>) {
|
||||
return json.get<Object>();
|
||||
} else if constexpr(std::is_enum_v<Object>) {
|
||||
return static_cast<Object>(json.get<std::underlying_type_t<Object>>());
|
||||
} else {
|
||||
Object object;
|
||||
for_each(object, [&json](std::string_view name, auto& member) {
|
||||
using Member = std::remove_cvref_t<decltype(member)>;
|
||||
if constexpr(impl::is_optional_v<Member>) {
|
||||
if(json.contains(name)) {
|
||||
member = deserialize<Member>(json[name]);
|
||||
}
|
||||
} else {
|
||||
member = deserialize<Member>(json[name]);
|
||||
}
|
||||
});
|
||||
return std::move(object);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user