如何将向量转换为Json对象? C++

2023-12-12

我有一个 RoomData 对象向量,这是该对象:

typedef struct RoomData
{
unsigned int id;
std::string name;
std::string maxPlayers;
unsigned int questionCount;
unsigned int timePerQuestion;
unsigned int isActive;
} RoomData;

我需要将此向量转换为 json 对象。 我怎样才能做到这一点?我不知道


jsoncons and nlohmann两者都支持 JSON 和 C++ 对象之间的转换,Martin York 的也是如此Thors序列化器(参见他的回答。)

给定 RoomData 向量,即:

namespace ns {
    struct RoomData
    {
        unsigned int id;
        std::string name;
        std::string maxPlayers;
        unsigned int questionCount;
        unsigned int timePerQuestion;
        unsigned int isActive;
    } RoomData;
}

std::vector<ns::RoomData> rooms;
rooms.push_back(ns::RoomData{ 1, "Room 1", "Few", 2, 56, 1 });
rooms.push_back(ns::RoomData{ 2, "Room 2", "Lots", 2, 56, 1 });

Using jsoncons转换为 JSON 并返回:

#include <iostream>
#include <jsoncons/json.hpp>

namespace jc = jsoncons;

// Declare the traits. Specify which data members need to be serialized.
JSONCONS_ALL_MEMBER_TRAITS(ns::RoomData, id, name, maxPlayers, 
                           questionCount, timePerQuestion, isActive);

int main()
{
    std::vector<ns::RoomData> rooms;
    rooms.push_back(ns::RoomData{ 1, "Room 1", "Few", 2, 56, 1 });
    rooms.push_back(ns::RoomData{ 2, "Room 2", "Lots", 2, 56, 1 });

    std::string s;
    jc::encode_json(rooms, s, jc::indenting::indent);
    std::cout << "(1)\n" << s << "\n\n";

    auto rooms2 = jc::decode_json<std::vector<ns::RoomData>>(s);

    std::cout << "(2)\n";
    for (auto item : rooms2)
    {
        std::cout << "id: " << item.id << ", name: " << item.name 
                  << ", maxPlayers: " << item.maxPlayers << "\n"; 
    }
}

Output:

(1)
[
    {
        "id": 1,
        "isActive": 1,
        "maxPlayers": "Few",
        "name": "Room 1",
        "questionCount": 2,
        "timePerQuestion": 56
    },
    {
        "id": 2,
        "isActive": 1,
        "maxPlayers": "Lots",
        "name": "Room 2",
        "questionCount": 2,
        "timePerQuestion": 56
    }
]

(2)
id: 1, name: Room 1, maxPlayers: Few
id: 2, name: Room 2, maxPlayers: Lots

Using nlohmann转换为 JSON 并返回:

#include <iostream>
#include <iomanip>
#include <nlohmann/json.hpp>

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::RoomData& val)
{
    j.at("id").get_to(val.id);
    j.at("name").get_to(val.name);
    j.at("maxPlayers").get_to(val.maxPlayers);
    j.at("questionCount").get_to(val.questionCount);
    j.at("timePerQuestion").get_to(val.timePerQuestion);
    j.at("isActive").get_to(val.isActive);
}

void to_json(nh::json& j, const ns::RoomData& val)
{
    j["id"] = val.id;
    j["name"] = val.name;
    j["maxPlayers"] = val.maxPlayers;
    j["questionCount"] = val.questionCount;
    j["timePerQuestion"] = val.timePerQuestion;
    j["isActive"] = val.isActive;
}
} // namespace ns

int main()
{
    std::vector<ns::RoomData> rooms;
    rooms.push_back(ns::RoomData{ 1, "Room 1", "Few", 2, 56, 1 });
    rooms.push_back(ns::RoomData{ 2, "Room 2", "Lots", 2, 56, 1 });

    std::stringstream ss;

    nh::json j = rooms;

    ss << std::setw(4) << j;

    std::cout << "(1)\n" << ss.str() << "\n\n";

    nh::json j2 = nh::json::parse(ss.str());
    auto rooms2 = j2.get<std::vector<ns::RoomData>>();

    std::cout << "(2)\n";
    for (auto item : rooms2)
    {
        std::cout << "id: " << item.id << ", name: " << item.name 
                  << ", maxPlayers: " << item.maxPlayers << "\n"; 
    }
}

Output:

(1)
[
    {
        "id": 1,
        "isActive": 1,
        "maxPlayers": "Few",
        "name": "Room 1",
        "questionCount": 2,
        "timePerQuestion": 56
    },
    {
        "id": 2,
        "isActive": 1,
        "maxPlayers": "Lots",
        "name": "Room 2",
        "questionCount": 2,
        "timePerQuestion": 56
    }
]

(2)
id: 1, name: Room 1, maxPlayers: Few
id: 2, name: Room 2, maxPlayers: Lots
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将向量转换为Json对象? C++ 的相关文章

随机推荐

  • 与绘图线一起创建标签

    我问了一个有关自定义小部件的问题 但对我是否需要它以及应该如何进行感到困惑 我目前有这门课 public class GUIEdge public Node node1 public Node node2 public int weight
  • 从 GCP 连接到 Azure SQL 时出现 NoClassDefFoundError com/microsoft/aad/adal4j/AuthenticationException

    我的 Spark 项目位于 GCP 中的 data proc 上 并在 Spark 提交上运行驱动程序 当我尝试连接到 Azure SQL DB 时 它抛出以下异常 20 39 15 DOCKER Exception in thread m
  • 为什么无序流比有序流更快?

    我正在阅读 Richard Warburton 所著的 Java 8 书籍 并得出以下结论 某些操作在有序流上的成本更高 这个问题可以 可以通过消除排序来解决 为此 请调用流的unordered方法 我对此感到非常困惑 假设我们有Strea
  • Pandas 反向分割函数

    我有一个 Pandas Dataframe 其中有一列 如下所示 Car Make 0 2017 Abarth 124 Spider ManualConvertible 1 2017 Abarth 124 Spider AutoConver
  • 已过时 - 关键帧之间的 FFMPEG 解码伪影

    将问题标记为过时 因为使用已弃用的 avcodec decode video2 I m currently experiencing artifacts when decoding video using ffmpegs api On wh
  • 在 Tkinter 上显示标签一段固定的时间

    我正在使用 Tkinter 在 Python 2 7 中创建一个 GUI 应用程序 我有这段代码 vis Label pur text Purchase Added successfully font 8 vis place x 150 y
  • 如何将 Intel 80386 机器代码转换为汇编语言?

    我被赋予以下任务 考虑以下十六进制值序列 55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3 该字节
  • 将表 A 中的行移动到表存档中

    是否可以每周自动将 3 天前的行移动到 mysql 中另一个名为 Table Archive 的表中 表A例如 ID stringvalue Timestamp 1 abc 2011 10 01 2 abc2 2011 10 02 3 ab
  • JPA/Hibernate 提高批量插入性能

    我有一个数据模型 该模型在 1 个实体和 11 个其他实体之间具有一对多关系 这12个实体一起代表一个数据包 我遇到的问题与这些关系的 多 侧发生的插入数量有关 其中一些可以有多达 100 个单独的值 因此要将整个数据包保存在数据库中 最多
  • git如何存储文件?

    我刚刚开始学习 git 为此我开始阅读Git 社区书籍 在这本书中他们说SVN和CVS存储文件之间的差异 而git存储所有文件的快照 但我不太明白他们所说的快照是什么意思 git 真的会在每次提交时生成所有文件的副本吗 因为这就是我从他们的
  • C++ 随机数

    在以下情况 http www fredosaurus com notes cpp misc random html 它提到如果我们想生成一个范围内的随机数1 10 我们可以执行以下操作 r rand 10 1 为什么我们要添加1 您能解释一
  • iPhone URL 编码问题

    有一个小问题 尝试将 XML 发布到服务器 为此 我必须以 URL 格式对 XML 字符串进行编码 NSString encodedString NSString stringWithFormat xmlValue post stringB
  • Bash Shell:无法使用变量 $ 作为运行 tar 的路径

    这是一个非常简短的问题 但是放置变量是否存在语法错误 example作为 bash 文件中 tar 的参数 我将文件写为 only portion that really matters bin bash tar cvpzf filenam
  • ItemCommand 在 Repeater 或 GridView 中第一次单击时不会触发

    这两天已经让我发疯了 希望有人以前见过这个 我遇到这样的问题 第一次单击中继器或网格视图中的控件无法触发 ItemCommand 事件 但所有后续单击都有效 控件被加载到 Base aspx 上的占位符中 如下所示 private void
  • Cordova Web视图在android中清除缓存

    我正在尝试清除存储在使用 cordova webview 的 android 应用程序中的缓存 我尝试过cordovaWebView clearCache true 还尝试过 public void deleteCache Context
  • uintptr_t 数据类型是什么?

    What is uintptr t它可以用来做什么 首先 在提出问题时 uintptr t不是用C 写的 它在 C99 中 在
  • 如何在 Android 中将颜色 LUT 应用于位图图像以获得滤镜效果?

    这里我有一个关于 android 中的 LUT 的问题 我的问题是 我有 4X4 LUT 使用这些 LUT 对 Android 中的位图图像应用滤镜效果 下面是我的示例 LUT 文件链接 Lut 链接示例 在安卓上可以实现吗 如果可以的话请
  • 如何在 Eclipse Juno/Kepler/Luna CDT 中启用 C++11?

    编辑 事实证明这确实不是 Eclipse Kepler 特有的 我必须对 Eclipse Juno 使用相同的过程 问题是 在回答同一问题的其他帖子中似乎缺少步骤 我正在使用 Eclipse Kepler for C 并尝试使用 C 11
  • 在 Linux 中混合使用 32 位和 64 位库 (gcc)

    我有一个为 Linux 使用 gcc 构建的 32 位纯二进制 C so 由供应商提供 我需要链接到 64 位 C C 应用程序 我正在开发 有什么方法可以从我的应用程序访问这个库吗 我知道需要小心处理 so 内部函数的参数和指针 而且我知
  • 如何将向量转换为Json对象? C++

    我有一个 RoomData 对象向量 这是该对象 typedef struct RoomData unsigned int id std string name std string maxPlayers unsigned int ques