jsoncons , nlohmann и ThorsSerializer все поддерживают преобразование между объектами JSON и C ++.Примеры с jsoncons и nlohmann показаны ниже, у Мартина Йорка есть один для его ThorsSerializer в отдельной публикации.Последнее, на мой взгляд, очень приятно, и, безусловно, выигрывает приз за краткость.В духе цитаты Оскара Уайльда, что «имитация является самой искренней формой лести», я представил макрос JSONCONS_MEMBER_TRAITS_DECL в jsoncons и соответственно изменил этот пример.
Рассмотрим
const std::string s = R"(
[
{
"author" : "Haruki Murakami",
"title" : "Kafka on the Shore",
"price" : 25.17
},
{
"author" : "Charles Bukowski",
"title" : "Pulp",
"price" : 22.48
}
]
)";
namespace ns {
struct book
{
std::string author;
std::string title;
double price;
};
} // namespace ns
Использование jsoncons для преобразования между s
и std::vector<ns::book>
:
#include <jsoncons/json.hpp>
namespace jc = jsoncons;
// Declare the traits. Specify which data members need to be serialized.
JSONCONS_MEMBER_TRAITS_DECL(ns::book,author,title,price);
int main()
{
std::vector<ns::book> book_list = jc::decode_json<std::vector<ns::book>>(s);
std::cout << "(1)\n";
for (const auto& item : book_list)
{
std::cout << item.author << ", "
<< item.title << ", "
<< item.price << "\n";
}
std::cout << "\n(2)\n";
jc::encode_json(book_list, std::cout, jc::indenting::indent);
std::cout << "\n\n";
}
Вывод:
(1)
Haruki Murakami, Kafka on the Shore, 25.17
Charles Bukowski, Pulp, 22.48
(2)
[
{
"author": "Haruki Murakami",
"price": 25.17,
"title": "Kafka on the Shore"
},
{
"author": "Charles Bukowski",
"price": 22.48,
"title": "Pulp"
}
]
Использование nlohmann для преобразования между s
и std::vector<ns::book>
:
#include <nlohmann/json.hpp>
#include <iomanip>
namespace nh = nlohmann;
// Provide from_json and to_json functions in the same namespace as your type
namespace ns {
void from_json(const nh::json& j, ns::book& val)
{
j.at("author").get_to(val.author);
j.at("title").get_to(val.title);
j.at("price").get_to(val.price);
}
void to_json(nh::json& j, const ns::book& val)
{
j["author"] = val.author;
j["title"] = val.title;
j["price"] = val.price;
}
} // namespace ns
int main()
{
nh::json j = nh::json::parse(s);
std::vector<ns::book> book_list = j.get<std::vector<ns::book>>();
std::cout << "\n(1)\n";
for (const auto& item : book_list)
{
std::cout << item.author << ", "
<< item.title << ", "
<< item.price << "\n";
}
std::cout << "\n(2)\n";
nh::json j2 = book_list;
std::cout << std::setw(4) << j2 << "\n\n";
}
Вывод:
(1)
Haruki Murakami, Kafka on the Shore, 25.17
Charles Bukowski, Pulp, 22.48
(2)
[
{
"author": "Haruki Murakami",
"price": 25.17,
"title": "Kafka on the Shore"
},
{
"author": "Charles Bukowski",
"price": 22.48,
"title": "Pulp"
}
]