nlohmann 是德国工程师,以其名字为工程名的 nlohmann/json 项目又被成为 JSON for Modern C++。
网上常见如何使用 nlohmann 生成 JSON 文件的中英文资料。但如何使用 nlohmann 解析 JSON 文件的 资料 不多,或者,不够清楚直接。
其实,工程的 README.md 写得也算清楚。但是对于从未接触过 JSON 文件的新手来说,还是不太友好。此篇主要向未接触过 JSON 文件的新手介绍如何快速使用 nlohmann 解析 JSON 文件。

工程引用

nlohmann 使用了 hpp,这种形式被称为 header only。在自己的工程中使用 nlohmann 时,仅需 #include “json.hpp” 即可。在所有 #include 之后,再添加一句 using json = nlohmann::json 会更加便捷。

简单文件解析

如果 JSON 文件够简单,如下,

{"pi":3.1415,"happy":true
}

包括任何结构体或数组,则解析代码如下:

#include "json.hpp"
#include <fstream>
#include <iostream>
using namespace std;
using json = nlohmann::json;
int main() {json j;         // 创建 json 对象ifstream jfile("test.json");jfile >> j;        // 以文件流形式读取 json 文件float pi = j.at("pi");bool happy = j.at("happy");return 0;
}

较复杂的 JSON 文件解析

一般来说,JSON 文件包含很多的层级,转换成 C++ 则是结构体。以下 json 文件为例:

{"output": {"width": 720,"height": 1080,"frameRate": 20,"crf": 31},"tracks": [{"name": "t1","pieces": [{"file": "x.mp4","startTime": 2,"endTime": 6},{"file": "y.mp4","startTime": 9,"endTime": 13}]},{"name": "t2","pieces": [{"file": "z.mp4","startTime": 0,"endTime": 10}]}]
}

这个 json 文件,人脑解析的话,我们可以看到,它包括两大部分 "output" 和 "tracks"。其中,output 可以用结构体来表示,其代码如下:

struct video_info {int width;int height;int frame_rate;int crf;
}

另一部分可看作是有两个元素的结构体 "tracks" 的数组,其结构体包括 string 的 name,和另一个结构体 "pieces" 的数组。用 C++ 代码可表示为如下:

struct pieceinfo {string  pathname;int     startTime;int     endTime;
};
struct trackinfo {string      name;pieceinfo   pieces[10];int         size;   // piceces 大小
};

了解析结构体类内容,需要定义对结构体的解析方法。因此,整个解析过程如下:

#include "json.hpp"
#include <iostream>
#include <fstream>using namespace std;
using json = nlohmann::json;namespace jsonns {struct videoinfo {int width;int height;int frameRate;int crf;};void from_json(const json& j, videoinfo& v) {j.at("width").get_to(v.width);j.at("height").get_to(v.height);j.at("frameRate").get_to(v.frameRate);j.at("crf").get_to(v.crf);}struct pieceinfo {string  pathname;int     startTime;int     endTime;};void from_json(const json&j, pieceinfo &p) {j.at("file").get_to(p.pathname);j.at("startTime").get_to(p.startTime);j.at("endTime").get_to(p.endTime);}struct trackinfo {string      name;pieceinfo   pieces[10];int         size;};void from_json(const json&j, trackinfo &t) {j.at("name").get_to(t.name);for(int i = 0; i < j["pieces"].size(); i++) {t.pieces[i] = j["pieces"][i];}t.size = j["pieces"].size();}
}int main()
{json j;ifstream jfile("test.json");jfile >> j;jsonns::videoinfo vi = j.at("output");int tilength = j["tracks"].size();jsonns::trackinfo ti[tilength];for (int i = 0; i < tilength; i++) {ti[i] = j["tracks"][i];}return 0;
}

使用 nlohmann 解析 json 文件相关推荐

  1. Java性能优化:正确的解析JSON文件

    为什么80%的码农都做不了架构师?>>>    数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceed ...

  2. python解析json_python解析json文件

    概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态 ...

  3. 如何使用PHP解析JSON文件? [重复]

    本文翻译自:How can I parse a JSON file with PHP? [duplicate] This question already has an answer here: 这个 ...

  4. 使用C/C++解析json文件

    目录 为什么? 怎么做? 为什么? 举个例子,我们在使用C/C++进行深度学习模型的测试,由于测试过程中可能有许多参数要传给model,比如在进行目标检测时,要传入nms阈值等.我们要最优化测试结果, ...

  5. java解析json文件_Java性能优化:正确的解析JSON文件

    数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceeded)一次,发现都是在下载处理 JSON Atom Feed时OO ...

  6. Python解析json文件

    Python解析json文件 实现代码 import json import sysstdout = sys.stdoutwith open("company.json", &qu ...

  7. 关于 pandas 解析 json 文件和其他类型文件的结果中日期格式数据类型不一致的问题

    问题: 我有两个文件,一个 .csv 文件和一个 .json 文件,数据截图分别如下: 我的目的是解析这些文件,并将结果统一交由下一个程序块进行处理. 在了解到 pandas 可以解析数据文件(csv ...

  8. 解析json文件、执行批量修改sql

    要求:解析json文件,取出其中的参数,修改数据库中的数据 数据量:190万条 使用线程池批量处理sql 1.线程: public class DateHandleThread extends Thr ...

  9. 解析json文件的Go依赖包

    上一篇golang读取json配置文件介绍了使用encoding/json包来解析json文件,但是这种方法在面对结构复杂.字段较多的情况时,解析效率不是很高.上一篇中,我们在解析json文件时,需要 ...

最新文章

  1. 优秀程序员都会关注的公众号
  2. Android 的 dex2jar 和 jd-gui 反编译 apk 源代码
  3. spring mvc 模拟数据库实现注册 登录
  4. python多进程间通信_python多进程间通信代码实例
  5. docker部署flask_使用Docker,GCP Cloud Run和Flask部署Scikit-Learn NLP模型
  6. PropertyGrid中的枚举显示为中文(转)
  7. 使用py2neo构建neo4j图模型小demo
  8. PHP多进程初探 --- 再次谈daemon进程
  9. kong 网关教程入门
  10. Cartographer 安装 2021.10.27
  11. Java函数、参数及传参方式详解
  12. 单片机原理与应用技术(四)———矩阵键盘汇编语言
  13. CSR3026开发问题总结-1
  14. java gdal生成彩色tiff文件 并压缩大小
  15. VTT字幕文件处理(vi + sed + awk)
  16. 2019乌鲁木齐·丝绸之路冰雪马拉松天山脚下鸣枪开跑
  17. sql自动生成汉语拼音和首字母函数[转载]
  18. “开源”SOA正在改写IT规划方程式
  19. 用WCAT进行IIS压力测试(转)
  20. InDesign 教程如何在帧之间流动文本?

热门文章

  1. java stream取对象Long类型属性最大值
  2. UnityC#学习之--弧度和角度相互转化
  3. Logistic回归与Softmax回归
  4. 斯人若遇彩虹,遇上方知有,征女
  5. 深圳最新政策:PMP持证者会有这些福利...
  6. 第一篇博客:聊一聊我准备用这个做些什么吧
  7. EAS BOS 新增分录时设置分录默认值
  8. 女孩子应该体谅男孩子的九个地方
  9. 技术不重要,技术很重要
  10. 计算机奥林匹克竞赛报名,2019年中学生信息学奥林匹克竞赛联赛报名时间、考试安排...