我正在从服务器下载json。我从服务器发送的对象是C#对象,看起来像这样:
public class User
{
public string UserName { get; set; }
public string Info { get; set; }
}
现在,我必须在我的C++应用程序中获取这些数据,我使用this library。
从服务器获取的对象的类型为:第一个月
如何从web::json::value
中获取用户名?
我正在从服务器下载json。我从服务器发送的对象是C#对象,看起来像这样:
public class User
{
public string UserName { get; set; }
public string Info { get; set; }
}
现在,我必须在我的C++应用程序中获取这些数据,我使用this library。
从服务器获取的对象的类型为:第一个月
如何从web::json::value
中获取用户名?
3条答案
按热度按时间g6ll5ycj1#
有两种解决办法。
手动执行
你可以提供一个接受
json::value
并返回你的类型的对象的函数:自动执行
C++
中没有反射。这是真的。但是如果编译器不能提供元数据,你可以自己提供。让我们从创建一个属性结构体开始:
好了,现在我们有了编译时自省系统的构建块。
现在,在类user中添加元数据:
现在您已经有了所需的元数据,可以通过递归来迭代它:
这就行了。
我没有测试这段代码,所以如果你有困难,请在评论中告诉我。
注意,你需要编写
asAny
函数,它只是一个接受Json::Value并调用正确的as_...
函数或另一个fromJson
的函数;)uqcuzwp82#
我已经修改了Guillaume解决方案以支持c11。下面是一个完整的工作解决方案,其中包含了一些c14的decay_t和enable_if_t特性的“polyfill”,以支持c++11:
使用libjsoncpp-dev作为依赖项,为了在Ubuntu 18.04下构建,您可以发出:
jpfvwuh43#
由于关于如何将JSON转换为任意对象有两种答案,并且都使用从头开始的解决方案,所以我觉得有必要引用原生支持类型转换的nlohmann::json。唯一需要实现的函数是项目名称空间中的
from_json
和to_json
函数。由于OP只提到了从JSON到User
的转换。我们只需要实现from_json
函数。在写这个答案的时候,它还与C++11兼容。更多相关信息可在此处找到:任意类型转换