2016-03-12 2 views
0

Доброе утро, ям, используя casablanca REST SDK.Преобразование Json String в объект C++ с использованием Casablanca REST SDK

Есть ли простой способ преобразования строки json в объект и обратно, как показано в этом примере? (http://www.newtonsoft.com/json/help/html/serializingjson.htm)

Update я нашел маленькую функцию, которая может делать то, что мне нужно. Когда я использую функцию, я получаю ошибки, как показано на рисунке. У кого-то есть решение?

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

Error

поздравление Cazza

+0

См ответ http://stackoverflow.com/a/39904347/606515 для JSON в/из преобразования объекта Lib C++. – kola

ответ

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

Там нет простого способа, как не отражение в C++. Вы должны написать функцию сериализации все по своему усмотрению.

Однако есть некоторые трюки, которые могут позволить вам написать сериализующую функцию (де) по списку членов внутри макроса, но у Casablanca нет никакой помощи в этом.

0

К счастью, C++ не предлагает простой способ размытия линии между сетевым коммуникационным контентом и исходным кодом вашей программы. Что-то вроде всех этих ужасных основанных на размышлении Библиотеки JSON там не могут быть с C++. Кстати, хотя я не могу говорить о C#, основанные на отражениях библиотеки JSON на Java являются огромным нарушением лучших практик, описанных в знаменитой книге Effective Java Джошуа Блоха. См пункт 53, Предпочитают интерфейсы для отражения:

Как правило, объекты не должны быть доступны рефлекторно в нормальных приложений во время выполнения

В C++, нам не нужно такое руководство, потому что нет никакого отражения. Это в основном хорошее вещь.

Теперь, это не значит, что вам нужно написать собственный анализатор JSON, конечно. Хотя разбор JSON не является частью стандартной библиотеки, существуют сторонние альтернативы. Например, посмотрите на JSON for Modern 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" 

Такое подход также называется неинтрузивным сериализации/десериализации.С другой стороны, подход intrusive с функциями члена или friend был бы единственным способом, если вам нужен доступ к частным переменным-членам.

Вещи, чтобы иметь в виду:

  • времени выполнения отражения является опасным и подверженным ошибкам в языках, которые поддерживают его.
  • C++ не имеет отражения во время выполнения.
  • C++ рекомендует вам четко разделить две проблемы: (1) Разбор JSON, (2) Сериализация/десериализация класса.
  • Существуют бесплатные сторонние библиотеки для разбора JSON.
+0

Спасибо за этот совет, который помог мне с моим решением. – Cazzador

 Смежные вопросы

  • Нет связанных вопросов^_^