消息序列化工具-为现代C++设计的jsoncpp介绍与使用技巧

2023-05-16

概述

JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传输格式。

本文并不详细介绍 JSON 本身的细节,旨在讨论如何使用 C++ 语言来处理 JSON。关于 JSON 更具体的信息,可参见 JSON 官网:http://www.json.org。

本文选择处理 JSON的 C++ 库

本文选择一个开源的 jsoncpp 来解析 JSON。jsoncpp 是比较出名的 C++ JSON 解析库。在 JSON 官网也是首推的。

项目地址

https://github.com/nlohmann/json.git

jsoncpp设计目标:

  • 直观的语法。在Python等语言中,JSON感觉像是第一类数据类型。该项目用了现代c++的所有运算符魔法来在代码中实现同样的感觉。

  • 化繁为简。整个代码由一个头文件json.hpp组成。没有库,没有子项目,没有依赖关系,没有复杂的构建系统。这个类是用普通c++ 11编写的。总而言之,一切都不需要调整编译器标志或项目设置。

  • 严格的测试。代码经过了大量的单元测试,覆盖了100%的代码,包括所有异常行为。此外,检查了Valgrind和Clang sanitizer,没有内存泄漏。谷歌OSS-Fuzz还对所有解析器全天候运行fuzz测试,到目前为止有效地执行了数十亿次测试。为了保持高质量,该项目遵循核心基础设施倡议(CII)的最佳实践。

clone

git clone https://github.com/nlohmann/json.git

或者克隆包含最近一次commit的分支

git clone https://github.com/nlohmann/json.git --depth=1

使用方法

  • 获取头文件

    cp json/single_include/nlohmann/json.hpp json.hpp
    
  • 在源文件中包含头文件

    #include "json.hpp"
    
  • 为便于使用,定义别名

    using Json = nlohmann::json;
    
  • 直接使用定义后的别名类和方法 Json and Json::parse directly

示例

使用起来简单方便,可以直接像C++的容器一样使用。
参考代码如下:

   //#define LOGI printf
   #define LOGI(...) \
      do { printf("%s:%3d ", __FILE__, __LINE__); printf(__VA_ARGS__); printf("\n"); } while (0)

   // create an empty structure (null)
   Json jo;

   // add a number that is stored as double (note the implicit conversion of jo to an object)
   jo["pi"] = 3.141;

   // add a Boolean that is stored as bool
   jo["happy"] = true;

   // add a string that is stored as std::string
   jo["name"] = "Niels";

   // add another null object by passing nullptr
   jo["nothing"] = nullptr;

   // add an object inside the object
   jo["answer"]["everything"] = 42;

   // add an array that is stored as std::vector (using an initializer list)
   jo["list"] = { 1, 0, 2 };
   std::vector<int> vect{3, 4, 5};
   jo["list2"] = vect;

   // add another object (using an initializer list of pairs)
   jo["object1"] = Json::array({ {"currency", "USD"}, {"value", 42.99} });
   jo["object2"] = { {"currency", "USD"}, {"value", 42.99} };

   // explicit conversion to string
   std::string str = jo.dump();
   LOGI("jo dump string: %s", str.c_str());

   // serialization with pretty printing
   // pass in the amount of spaces to indent
   LOGI("jo dump: %s", jo.dump(2).c_str());

   // instead, you could also write (which looks very similar to the JSON above)
   Json jo1 = {
       {"pi", 3.141},
       {"happy", true},
       {"name", "Niels"},
       {"nothing", nullptr},
       {"answer", {
                      {"everything", 42}
                  }},
       {"list", {1, 0, 2}},
       {"object", {
                      {"currency", "USD"},
                      {"value", 42.99}
                  }}
   };
   LOGI("jo1 dump: %s", jo1.dump(2).c_str());

   // parse explicitly
   Json jo2 = Json::parse(R"({"happy": true, "pi": 3.141})");
   LOGI("jo2 dump: %s", jo2.dump(2).c_str());

   Json jo3 = Json::parse(jo1.dump());
   if (jo3.contains("hello")) {
       std::string hello = jo3["hello"];
       // std::string hello = jo3.at("hello");
       LOGI("hello: %s", hello.c_str());
   } else {
       LOGI("not contains hello");
   }

   float pi = jo3["pi"];
   bool happy = jo3["happy"];
   std::string name = jo3["name"];
   int value = jo3["answer"]["everything"];
   std::list<int> ls = jo3["list"];

   LOGI("pi: %g", pi);
   LOGI("happy: %s", happy ? "true" : "false");
   LOGI("name: %s", name.c_str());
   LOGI("value: %d", value);
   for (auto &i : ls) {
       LOGI("list: %d", i);
   }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息序列化工具-为现代C++设计的jsoncpp介绍与使用技巧 的相关文章

随机推荐

  • B-Code For 1 Codeforces 768【递归】 好题!

    题意 xff1a 起初 xff0c 序列中仅有数n if n 61 0 amp amp n 61 1 在原来的位置补充3个元素n 2 n 2 n 2 直至该序列用仅有0和1 现在问区间 l r 有多少个1 思路 xff1a 一开始想用vec
  • AtCoder褐名记

    今年四月份开始参加AtCoder比赛 xff0c 至今参加了9次 在第9次结束后 xff0c 涨了一级 xff0c 从最低级的灰名涨到倒数第二级的褐名 相对于我这样的新手而言 xff0c AtCoder比TopCoder和Codeforce
  • 基于FFmpeg H264 + G711A 音视频裸流合并 MP4文件 ( G711A 转 AAC)

    由于 FFmpeg 只支持H264 43 AAC的mp4封装格式的 xff0c 并不支持H264 43 G711的mp4封装格式 所以需要将G711a转码成AAC格式的 然后封装成mp4文件 xff0c 但网上有说 通过修改movenc c
  • YOLOV3 网络结构学习笔记

    注 xff1a 本文非原创 xff0c 文章内容都是引用以下文章中 xff0c 本文只是记录学习笔记 yolo系列之yolo v3 深度解析 木盏的博客 CSDN博客 yolo3 YOLO v3算法详解 Atlas 的博客 CSDN博客 y
  • 基于人脸特征点实现疲劳检测

    为了有效监测驾驶员是否疲劳驾驶 避免交通事故的发生 提出了一种利用人脸特征点进行实时疲劳驾驶检测的新方法 对驾驶员驾驶时的面部图像进行实时监控 首先检测人脸 并利用ERT算法定位人脸特征点 然后根据人脸眼睛区域的特征点坐标信息计算眼睛纵横比
  • 基于 HPSocket , 实现 socket 通讯

    HPSocket HP Socket 是一套通用的高性能 TCP UDP HTTP 通信框架 xff0c 包含服务端组件 客户端组件和 Agent 组件 xff0c 广泛适用于各种不同应用场景的 TCP UDP HTTP 通信系统 xff0
  • windows 基于 MediaPipe 实现 PoseTracking

    MediaPipe是用于构建跨平台多模态应用ML管道的框架 xff0c 其包括快速ML推理 xff0c 经典计算机视觉和媒体内容处理 xff08 如视频解码 xff09 在2019年6月举行的CVPR大会 xff0c MeidaPipe正式
  • windows 基于 MediaPipe 实现 HandTracking

    OverView 感知手的形状和运动的能力可能是改善跨各种技术领域和平台的用户体验的重要组成部分 例如 xff0c 它可以构成手语理解和手势控制的基础 xff0c 还可以在增强现实中将数字内容和信息叠加在物理世界之上 虽然对人们来说很自然
  • DeepStream 部署 RTSP + scaled-yolov4 (tensorrtx)

    DeepStream应用程序将深度神经网络和其他复杂的处理任务引入到流处理管道中 xff0c 以实现对视频和其他传感器数据的近实时分析 从这些传感器中提取有意义的见解为提高运营效率和安全性创造了机会 例如 xff0c 摄像头是当前使用最多的
  • DeepStream 多路拉取RTSP视频流

    上一篇介绍DeepStream 如何集成Yolov4模型 xff0c 那么本篇介绍下如何实现读取多路RTSP 代码 主要代码参考 https github com belarbi2733 deepstream rtspsrc yolo详细代
  • 编码格式(关于utf-8,gb2312,gbk,big5等)

    计算机数据是以二进制的方式来存储 xff0c 符号代表文字 那么二进制数据表示的模式就是编码 xff0c 跟电报的加密解密是一个道理 xff0c 那么如何将这些数据转化成有效字符 xff0c 这就涉及到了编码格式 xff0c 一般常见的编码
  • Ubuntu配置桥接网络

    第一步 xff1a 点击虚拟机 xff0c 点击设置 第二步 xff1a 点击网络适配器 xff0c 选中桥接模式并确定 第三步 xff1a 点击编辑 xff0c 打开虚拟网络编辑器 xff0c 选中桥接模式 点击 网络属性 找到描述 xf
  • 基于 NCNN, 实现 yolov8

    记录下 基于 ncnn 实现 yolov8 的全部过程 修改 ultralytics nn modules py class Detect forward 和 class C2f forward span class token keywo
  • HRNet 训练自定义数据集

    基于 HRNet 训练人脸特征点数据集 INSTALL conda create n openmmlab span class token assign left variable python span span class token
  • Chatgpt 指令收集

    在使用 ChatGPT 时 xff0c 当你给的指令越精确 xff0c 它的回答会越到位 xff0c 举例来说 xff0c 假如你要请它帮忙写文案 xff0c 如果没给予指定情境与对象 xff0c 它会不知道该如何回答的更加准确 一 写报告
  • openEuler 安装图形桌面环境Gnome或DDE或UKUI

    由于openEuler系统主要针对服务器 xff0c 目前默认安装之后没有图形桌面环境 xff0c 需要的用户可以自己手动安装配置 这里推荐安装深度桌面DDE或优麒麟UKUI环境 安装gnome桌面 sudo dnf makecache s
  • Ubuntu更换国内镜像源

    由于Ubuntu官方镜像速度有限 xff0c 可以使用国内镜像加速更新和下载 xff0c 节约时间 常用的国内镜像有很多 xff0c 本人常用的有如下几个 xff0c 仅供参考 163镜像 mirrors 163 com 清华镜像 mirr
  • ubuntu-2204 gerrit ssh 报错Permission denied (publickey).分析及解决

    ubuntu 2204 gerrit ssh 报错Permission denied publickey 分析及解决 使用repo init sync下载代码时遇到报错 Permission denied publickey 分析排查步骤
  • 消息序列化工具-protobuf介绍及安装使用技巧

    简介 protobuf是google团队开发的用于高效存储和读取结构化数据的工具 xml json也可以用来存储此类结构化数据 xff0c 但是使用protobuf表示的数据能更加高效 xff0c 并且将数据压缩得更小 xff0c 大约是j
  • 消息序列化工具-为现代C++设计的jsoncpp介绍与使用技巧

    概述 JSON 的全称为 xff1a JavaScript Object Notation xff0c 顾名思义 xff0c JSON 是用于标记 Javascript 对象的 xff0c JSON 官方的解释为 xff1a JSON 是一