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

热门文章

  1. java 记录方法调用链
  2. react之纯函数、函数组件
  3. 欧瑞变频器故障码表_欧瑞f2000-g变频器故障代码是什么?请生意经的朋友帮忙解答...
  4. JAVA实现简单的记事本功能
  5. ITIL4 讲解: IT服务连续性管理(灾备)
  6. SELECT CASE WHEN 用法
  7. 第三章 复变函数的积分 知识点总结(Jeff自我感悟)
  8. JAVA静态内部类加载顺序
  9. 工业现场为何必须使用工业环网交换机?
  10. 非流式语音合成和流式语音合成