使用 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文件时,需要 ...
最新文章
- security面试_精选41 道 Spring Boot 面试题,附答案!
- 一根棉签解决身上各种酸痛,立马感觉无比舒畅!
- 解决wamp、vertrigo等集成环境安装后apache不能启动的问题
- android打包apk、apk签名及360加固工具的使用
- 数组转换成json key-value形式
- eclipse发布web显示异常,清除缓存也无效?
- 零基础,快速安装dedeCMS 搭建网站 - 总结大全
- 自适应网站设计对百度友好的关键:添加applicable-device标签(转)
- apollo 配置中心_Spring Cloud 系列之 Apollo 配置中心(三)
- BaseRecyclerViewAdapterHelper: 灵活强大的循环适配器
- 判断回文串时忽略既非字母又非数字的字符
- linux中使用egrep取值ip地址,egrep命令_Linux egrep 命令用法详解:在文件内查找指定的字符串...
- 谈谈我们的学习和我们的Blog
- IDL实现矢量(shp)裁剪栅格TASK(一)
- android音乐播放器歌词乱码,手机听歌显示乱码 没歌词 教你如何一键解决
- 计算机一级三维饼图,计算机考试excel制作复合饼图的方法
- English trip V1 - 1.How Do You Feel Now? Teacher:Lamb Key:形容词(Adjectives)
- python爬取LOL皮肤
- Java调用有道翻译API包括APPID/密钥地址注册
- Vivado 2020 安装