使用 Casablanca REST SDK 将 Json 字符串转换为 C++ 对象
Convert Json String to C++ Object using Casablanca REST SDK
早上好,我正在使用 casablanca REST SDK。
是否有任何简单的方法来将对象中的 json 字符串转换回来,如本示例所示?
(http://www.newtonsoft.com/json/help/html/serializingjson.htm)
更新
我发现了一个可以满足我需要的小功能。
当我使用该功能时,出现如图所示的错误。
有人对此有解决方案吗?
User GetUser(http_request *Reques)
{
return Request->body().extract<User>().get();
}
问候卡扎
没有简单方法,因为 C++ 中没有反射。
您必须自己编写序列化函数。
然而,有些技巧可能允许您通过宏中的成员列表编写(反)序列化函数,但卡萨布兰卡没有任何帮助。
幸运的是,C++ 没有提供简单的方法来模糊网络通信内容和程序源代码之间的界限。像所有那些 可怕的基于反射的 JSON 库这样的东西不可能发生在 C++ 上。巧合的是,虽然我不能代表 C#,但 Java 中基于反射的 JSON 库严重违反了 Joshua Bloch 著名的 Effective Java 书中概述的最佳实践。请参阅项目 53,首选接口而不是反射:
As a rule, objects should not be accessed reflectively in normal
applications at runtime
在C++中,我们不需要这样的准则,因为没有反射。这主要是一件 好事。
当然,这并不是说您必须编写自己的 JSON 解析器。虽然 JSON 解析不是标准库的一部分,但存在第 3 方替代方案。例如,看看 JSON for Modern C++.
无论您使用什么库,您都必须显式以一种或另一种方式读取和写入您的 class 成员。
也就是说,如果您有以下 class(或多或少与您链接的 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"
这种方法也称为非侵入式 serialisation/deserialisation。另一方面,如果您需要访问私有成员变量,侵入式 方法使用成员或 friend
函数将是唯一的方法。
注意事项:
- 运行时间反射在支持它的语言中是危险且容易出错的。
- C++ 没有 运行 时间反射。
- C++ 鼓励您明确区分两个问题:(1) JSON 的解析,(2) class.
的 Serialisation/deserialisation
- 存在用于 JSON 解析的免费第 3 方库。
这里是剪断的
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()))
早上好,我正在使用 casablanca REST SDK。
是否有任何简单的方法来将对象中的 json 字符串转换回来,如本示例所示? (http://www.newtonsoft.com/json/help/html/serializingjson.htm)
更新 我发现了一个可以满足我需要的小功能。 当我使用该功能时,出现如图所示的错误。 有人对此有解决方案吗?
User GetUser(http_request *Reques)
{
return Request->body().extract<User>().get();
}
问候卡扎
没有简单方法,因为 C++ 中没有反射。 您必须自己编写序列化函数。
然而,有些技巧可能允许您通过宏中的成员列表编写(反)序列化函数,但卡萨布兰卡没有任何帮助。
幸运的是,C++ 没有提供简单的方法来模糊网络通信内容和程序源代码之间的界限。像所有那些 可怕的基于反射的 JSON 库这样的东西不可能发生在 C++ 上。巧合的是,虽然我不能代表 C#,但 Java 中基于反射的 JSON 库严重违反了 Joshua Bloch 著名的 Effective Java 书中概述的最佳实践。请参阅项目 53,首选接口而不是反射:
As a rule, objects should not be accessed reflectively in normal applications at runtime
在C++中,我们不需要这样的准则,因为没有反射。这主要是一件 好事。
当然,这并不是说您必须编写自己的 JSON 解析器。虽然 JSON 解析不是标准库的一部分,但存在第 3 方替代方案。例如,看看 JSON for Modern C++.
无论您使用什么库,您都必须显式以一种或另一种方式读取和写入您的 class 成员。
也就是说,如果您有以下 class(或多或少与您链接的 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"
这种方法也称为非侵入式 serialisation/deserialisation。另一方面,如果您需要访问私有成员变量,侵入式 方法使用成员或 friend
函数将是唯一的方法。
注意事项:
- 运行时间反射在支持它的语言中是危险且容易出错的。
- C++ 没有 运行 时间反射。
- C++ 鼓励您明确区分两个问题:(1) JSON 的解析,(2) class. 的 Serialisation/deserialisation
- 存在用于 JSON 解析的免费第 3 方库。
这里是剪断的
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()))