我已经 20 多年没有使用过 C++了,所以我对此有点生疏。
我正在使用 nlohmann/json json.h 库,需要将作为对象数组的 JSON 字符串转换为实际数组。
作为示例,我需要从 TRESTResponse 对象获取此类响应并将其转换为 C++ 数组:
RESTRequest1->Execute();
String Content = RESTResponse1->Content;
其中内容=
"[{"fullname":"Norm A","e_mail":null,"phone":"999-555-4971"},{"fullname":"Norm C","e_mail":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="630b1751231a020b0c0c4d000c0e" rel="noreferrer noopener nofollow">[email protected]</a>","phone":"999-555-8887"},{"fullname":"Norma Jn","e_mail":null,"phone":"999-555-5947"},{"fullname":"Norma & Frank L","e_mail":null,"phone":"999-555-1790"},{"fullname":"Norm Sh","e_mail":null,"phone":"999-555-7545"},{"fullname":"Norm S","e_mail":null,"phone":"999-555-9955"}]"
并将其放入对象数组中。我在图书馆没有成功。虽然我可以正确地将数组转换为 json,但我似乎无法将 json 返回到数组。
我在 Stackoverflow 上看过一些类似的帖子,但没有看到涉及 nlohmann/json 库的帖子。
最佳答案
据猜测,您可能遇到了问题,因为您的输入数据中的许多字符串(某些电子邮件地址)包含 null
。
要解决此问题,您需要在尝试将源转换为 std::string
之前显式检查 is_null
。快速猜测一下,对于 null
输入,您可能只想将该字符串留空。为此,您的 from_json
看起来像这样:
void from_json(json const &j, Person &p) {
j.at("fullname").get_to(p.name);
if (!j.at("e_mail").is_null())
j.at("e_mail").get_to(p.email);
j.at("phone").get_to(p.phone);
}
这足以用于示例数据,但根据所涉及的数据,您可能希望/需要防止空名称和/或电话号码(您可以按照与上面所示相同的方式进行操作)电子邮件地址)。
使用此功能的完整演示程序可能大致如下所示:
#include <sstream>
#include <string>
#include <iostream>
#include "nlohmann/json.hpp"
using json = nlohmann::json;
std::string input { R"(
[{"fullname":"Norm A","e_mail":null,"phone":"999-555-4971"},{"fullname":"Norm C","e_mail":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="82eaf6b0c2fbe3eaededace1edef" rel="noreferrer noopener nofollow">[email protected]</a>","phone":"999-555-8887"},{"fullname":"Norma Jn","e_mail":null,"phone":"999-555-5947"},{"fullname":"Norma & Frank L","e_mail":null,"phone":"999-555-1790"},{"fullname":"Norm Sh","e_mail":null,"phone":"999-555-7545"},{"fullname":"Norm S","e_mail":null,"phone":"999-555-9955"}]
)"};
namespace P {
struct Person {
std::string name;
std::string email;
std::string phone;
friend std::ostream &operator<<(std::ostream &os, Person const &p) {
return os << "name: " << p.name << ", email: " << p.email << ", phone: " << p.phone;
}
};
void from_json(json const &j, Person &p) {
j.at("fullname").get_to(p.name);
if (!j.at("e_mail").is_null())
j.at("e_mail").get_to(p.email);
j.at("phone").get_to(p.phone);
}
}
int main() {
json j = json::parse(input);
std::vector<P::Person> people;
j.get_to(people);
for (auto const &person : people) {
std::cout << person << "\n";
}
}
关于c++ - 使用 nlohmann/json 将 JSON 转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71095775/