2016-03-12 51 views
0

早上好,使用casablanca REST SDK的iam。使用卡萨布兰卡REST SDK将Json字符串转换为C++对象

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

更新 我发现了一个小功能,可以做什么,我需要。 当我使用函数我得到错误如图所示。 有人为此提供解决方案吗?

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

Error

问候cazza

+0

参见响应http://stackoverflow.com/a/39904347/606515。 – kola

回答

0

而这里为JSON向/从C++对象转换lib中剪断

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())) 
0

有没有简单的方法为在C中没有思考++。 你必须自己编写序列化函数。

但是,有一些技巧可能允许您通过宏中的成员列表来编写序列化函数,但卡萨布兰卡没有任何帮助。

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++没有运行时反射。 (1)JSON解析,(2)类的序列化/反序列化。
  • 存在用于JSON解析的免费第三方库。
+0

感谢您的建议,这帮助我解决方案。 – Cazzador