gpt4 book ai didi

C++将json转为对象

转载 作者:太空狗 更新时间:2023-10-29 20:23:14 26 4
gpt4 key购买 nike

我正在从我的服务器下载 json。我从服务器发送的对象是 C# 对象,如下所示:

public class User
{
public string UserName { get; set; }
public string Info { get; set; }
}

现在,我必须在我的 C++ 应用程序中获取这些数据。我用 this library

我从服务器获得的对象类型为:web::json::value

如何从这个 web::json::value 中获取用户名?

最佳答案

有两种解决方案。

手动执行

您可以提供一个接受json::value 并返回您的类型的对象的函数:

User fromJson(json::value data) {
return User{data[U("username")].as_string(), data[U("info")].as_string()};
}

自动执行

C++ 中没有反射。真的。但如果编译器无法为您提供元数据,您可以自己提供。

让我们从创建一个属性结构开始:

template<typename Class, typename T>
struct Property {
constexpr Property(T Class::*aMember, const char* aName) : member{aMember}, name{aName} {}

using Type = T;

T Class::*member;
const char* name;
};

好的,现在我们有了编译时内省(introspection)系统的构建 block 。

现在在您的类用户中,添加您的元数据:

struct User {
constexpr static auto properties = std::make_tuple(
Property<User, std::string>{&User::username, "username"},
Property<User, std::string>{&User::info, "info"}
);

private:
std::string username;
std::string info;
};

现在您已经有了所需的元数据,您可以通过递归遍历它:

template<std::size_t iteration, typename T>
void doSetData(T&& object, const json::value& data) {
// get the property
constexpr auto property = std::get<iteration>(std::decay_t<T>::properties);

// get the type of the property
using Type = typename decltype(property)::Type;

// set the value to the member
object.*(property.member) = asAny<Type>(data[U(property.name)]);
}

template<std::size_t iteration, typename T, typename = std::enable_if_t<(iteration > 0)>>
void setData(T&& object, const json::value& data) {
doSetData<iteration>(object, data);
// next iteration
setData<iteration - 1>(object, data);
}

template<std::size_t iteration, typename T, typename = std::enable_if_t<(iteration == 0)>>
void setData(T&& object, const json::value& data) {
doSetData<iteration>(object, data);
}

template<typename T>
T fromJson(Json::Value data) {
T object;

setData<std::tuple_size<decltype(T::properties)>::value - 1>(object, data);

return object;
}

这样就可以了。

我没有测试这段代码,所以如果你遇到问题,请在评论中告诉我。

请注意,您需要编写 asAny 函数。它只是一个接受 Json::Value 并调用正确的 as_... 函数或另一个 fromJson ;)

的函数

关于C++将json转为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34090638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com