0

早上好,我正在使用 casablanca REST SDK。

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

更新 我发现了一个可以做我需要的小功能。当我使用该功能时,我得到错误,如图所示。有人对此有解决方案吗?

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

错误

问候卡扎

4

3 回答 3

0

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

然而,有一些技巧可以让你通过宏中的成员列表来编写你的(反)序列化函数,但卡萨布兰卡没有任何帮助。

于 2016-03-12T09:00:12.127 回答
0

幸运的是,C++ 没有提供简单的方法来模糊网络通信内容和程序源代码之间的界限。像所有那些糟糕的基于反射的JSON 库这样的事情不会发生在 C++ 上。巧合的是,虽然我不能代表 C#,但 Java 中基于反射的 JSON 库严重违反了 Joshua Bloch 著名的Effective Java书中概述的最佳实践。参见第 53 条,首选接口而不是反射

作为一项规则,对象不应在运行时在正常应用程序中进行反射访问

在 C++ 中,我们不需要这样的准则,因为没有反射。这主要是一件好事

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

无论您使用什么库,您都必须以一种或另一种方式显式地读取和写入您的类成员。

也就是说,如果您有以下类(或多或少与您链接的 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 解析的免费 3rd 方库。
于 2016-03-12T12:02:04.013 回答
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()))
于 2016-03-15T06:28:29.947 回答