当前位置:  开发笔记 > 编程语言 > 正文

C++将json转换为对象

如何解决《C++将json转换为对象》经验,为你挑选了1个好方法。

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

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

现在,我必须在我的C++应用程序中获取此数据.我使用这个库.

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

如何从中获取UserName web::json::value



1> Guillaume Ra..:

有两种解决方案.

手动完成

你可以提供一个函数来获取json::value并返回你的类型的对象:

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

自动完成

没有反思C++.真正.但是如果编译器无法为您提供元数据,您可以自己提供.

让我们从制作一个合理的结构开始:

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

    using Type = T;

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

好的,现在我们有了编译时内省系统的构建块.

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

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

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

现在您已拥有所需的元数据,您可以通过递归迭代它:

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

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

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

template 0)>>
void setData(T&& object, const json::value& data) {
    doSetData(object, data);
    // next iteration
    setData(object, data);
}

template>
void setData(T&& object, const json::value& data) {
    doSetData(object, data);
}

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

    setData::value - 1>(object, data);

    return object;
}

那就行了.

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

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

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有