使用 nlohmann 解析 json 文件
nlohmann 是德国工程师,以其名字为工程名的 nlohmann/json 项目又被成为 JSON for Modern C++。
网上常见如何使用 nlohmann 生成 JSON 文件的中英文资料。但如何使用 nlohmann 解析 JSON 文件的 资料 不多,或者,不够清楚直接。
其实,工程的 README.md 写得也算清楚。但是对于从未接触过 JSON 文件的新手来说,还是不太友好。此篇主要向未接触过 JSON 文件的新手介绍如何快速使用 nlohmann 解析 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 文件相关推荐
- Java性能优化:正确的解析JSON文件
为什么80%的码农都做不了架构师?>>> 数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceed ...
- python解析json_python解析json文件
概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态 ...
- 如何使用PHP解析JSON文件? [重复]
本文翻译自:How can I parse a JSON file with PHP? [duplicate] This question already has an answer here: 这个 ...
- 使用C/C++解析json文件
目录 为什么? 怎么做? 为什么? 举个例子,我们在使用C/C++进行深度学习模型的测试,由于测试过程中可能有许多参数要传给model,比如在进行目标检测时,要传入nms阈值等.我们要最优化测试结果, ...
- java解析json文件_Java性能优化:正确的解析JSON文件
数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceeded)一次,发现都是在下载处理 JSON Atom Feed时OO ...
- Python解析json文件
Python解析json文件 实现代码 import json import sysstdout = sys.stdoutwith open("company.json", &qu ...
- 关于 pandas 解析 json 文件和其他类型文件的结果中日期格式数据类型不一致的问题
问题: 我有两个文件,一个 .csv 文件和一个 .json 文件,数据截图分别如下: 我的目的是解析这些文件,并将结果统一交由下一个程序块进行处理. 在了解到 pandas 可以解析数据文件(csv ...
- 解析json文件、执行批量修改sql
要求:解析json文件,取出其中的参数,修改数据库中的数据 数据量:190万条 使用线程池批量处理sql 1.线程: public class DateHandleThread extends Thr ...
- 解析json文件的Go依赖包
上一篇golang读取json配置文件介绍了使用encoding/json包来解析json文件,但是这种方法在面对结构复杂.字段较多的情况时,解析效率不是很高.上一篇中,我们在解析json文件时,需要 ...
最新文章
- 优秀程序员都会关注的公众号
- Android 的 dex2jar 和 jd-gui 反编译 apk 源代码
- spring mvc 模拟数据库实现注册 登录
- python多进程间通信_python多进程间通信代码实例
- docker部署flask_使用Docker,GCP Cloud Run和Flask部署Scikit-Learn NLP模型
- PropertyGrid中的枚举显示为中文(转)
- 使用py2neo构建neo4j图模型小demo
- PHP多进程初探 --- 再次谈daemon进程
- kong 网关教程入门
- Cartographer 安装 2021.10.27
- Java函数、参数及传参方式详解
- 单片机原理与应用技术(四)———矩阵键盘汇编语言
- CSR3026开发问题总结-1
- java gdal生成彩色tiff文件 并压缩大小
- VTT字幕文件处理(vi + sed + awk)
- 2019乌鲁木齐·丝绸之路冰雪马拉松天山脚下鸣枪开跑
- sql自动生成汉语拼音和首字母函数[转载]
- “开源”SOA正在改写IT规划方程式
- 用WCAT进行IIS压力测试(转)
- InDesign 教程如何在帧之间流动文本?