使用Casablanca REST SDK将Json String转换为C ++对象

时间:2016-03-12 07:50:00

标签: c++ json casablanca

早上好,我使用卡萨布兰卡REST SDK。

有没有简单的方法来转换对象中的json字符串并返回,如本例所示? (http://www.newtonsoft.com/json/help/html/serializingjson.htm

更新 我找到了一个可以做我需要的功能的小功能。 当我使用该功能时,我会收到错误,如图所示。 有人为此提供解决方案吗?

User GetUser(http_request *Reques)
{
     return Request->body().extract<User>().get();
}

Error

问候cazza

3 个答案:

答案 0 :(得分:0)

没有简单的方法,因为C ++中没有反射。 您必须自己编写序列化功能。

然而,有一些技巧可能允许您通过宏中的成员列表编写(反)序列化功能,但卡萨布兰卡没有任何帮助这样做。

答案 1 :(得分:0)

幸运的是,C ++没有提供简单的方法来模糊网络通信内容和程序源代码之间的界限。像所有那些可怕的基于反射的 JSON库的东西都不可能发生在C ++中。巧合的是,虽然我不能代表C#,但Java中基于反射的JSON库严重违反了Joshua Bloch着名的Effective Java书中概述的最佳实践。参见项目53,首选接口到反射

  

通常,不应在正常情况下反复访问对象   运行时的应用程序

在C ++中,我们不需要这样的指导原则,因为没有反思。这主要是的事情。

现在,这并不是说你必须编写自己的JSON解析器。虽然JSON解析不是标准库的一部分,但存在第三方替代方案。例如,请查看JSON for Modern C++

无论您使用哪种图书馆,您都必须明确以某种方式读取和写信给您的班级成员。

也就是说,如果您有以下类(与您链接的C#示例或多或少匹配):

struct Product
{
    std::string name;
    int price;
    std::vector<std::string> sizes;
};

然后使用上述库,您必须将Product对象转换为JSON,如下所示:

json j = {
    { "name", product.name },   // explicit relationship between "name" and "name"
    { "price", product.price }, // explicit relationship between "price" and "price"
    { "sizes", product.sizes }  // explicit relationship between "sizes" and "sizes"
};

std::cout << j << "\n";

阅读:

json j;
std::cin >> j;

Product product;
product.name = j["name"];   // explicit relationship between "name" and "name"
product.price = j["price"]; // explicit relationship between "price" and "price"
product.sizes = j["sizes"]; // explicit relationship between "sizes" and "sizes"

这种方法也称为非侵入式序列化/反序列化。另一方面,如果您需要访问私有成员变量,那么使用成员或friend函数的侵入式方法将是唯一的方法。

要记住的事情:

  • 运行时反射在支持它的语言中很危险且容易出错。
  • C ++没有运行时反射。
  • C ++鼓励您清楚地区分两个问题:(1)解析JSON,(2)类的序列化/反序列化。
  • 存在用于JSON解析的免费第三方库。

答案 2 :(得分:0)

这里是剪切的

 bool User::LoadNewUser(json::value user)
{
    try{
        this->SetName(utility::conversions::to_utf8string(user[L"UserName"].as_string()));
        this->SetMail(utility::conversions::to_utf8string(user[L"Email"].as_string()));
        this->SetScreenName(utility::conversions::to_utf8string(user[L"ScreenName"].as_string()));


UserResponse Usermanagement::CreateNewUser(http_request *Request)
{
    UserResponse Resp;

    if (this->LoadNewUser(Request->extract_json().get()))