c++ - 使用 nlohmann/json 将 JSON 转换为数组

标签 c++ arrays json nlohmann-json

我已经 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/

相关文章:

JQuery 不接受 JSON 为有效

c++ - 在 C++ Builder 10 中加载 DLL 时,变体或安全数组被锁定

局部变量的 C++ lambda 词法闭包

c++ - 比枚举好

javascript - 在 IE 中将对象转换为数组(Javascript)

c++ - 传递给函数时数组为空

c++ - while 循环不等待方法完成

c - 从 C 中的二维数组读取镜像

jquery - $.getJSON 永远不会触发成功函数

c# - 在Unity中序列化和反序列化Json和Json数组