2309json.nlohmann数格示例1
参考
示例
下面是一些示例,可让你了解如何使用该类
.
除了以下示例之外,你可能还需要:
->检查文档
->浏览独立示例文件
每个API
函数(记录在API
文档中)都有相应独立示例文件
.如,emplace()
函数有一个匹配的emplace.cpp
示例文件.
从文件中读取JSON
json
类提供了操作JSON
值的API
.要通过读取JSON
文件创建json
对象,请如下:
#include <fstream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
//...
std::ifstream f("example.json");
json data = json::parse(f);
从JSON
文本创建json
对象
假设要按json
对象硬编码,来创建此文本JSON
值:
{"pi": 3.141,"happy": true
}
有多种选择:
//使用(原始)串文字和`json::parse`
json ex1 = json::parse(R"({"pi": 3.141,"happy": true}
)");
//使用用户定义的(原始)串字面
using namespace nlohmann::literals;
json ex2 = R"({"pi": 3.141,"happy": true}
)"_json;
//使用初化器列表
json ex3 = {{"happy", true},{"pi", 3.141},
};
JSON
作为第一类数据类型
假设要创建JSON
对象
{"pi": 3.141,"happy": true,"name": "Niels","nothing": null,"answer": {"everything": 42},"list": [1, 0, 2],"object": {"currency": "USD","value": 42.99}
}
使用此库,可编写:
//创建空结构(空)
json j;//添加一个存储为双精的数字(注意j到对象的隐式转换)j["pi"] = 3.141;
//添加存储为`bool`的布尔值
j["happy"] = true;
//添加存储为`std::string`的串
j["name"] = "Niels";
//通过传递`nullptr`添加另一个空对象
j["nothing"] = nullptr;
//在对象内添加对象
j["answer"]["everything"] = 42;
//添加存储为`std::vector`的数组(使用初化器列表)
j["list"] = { 1, 0, 2 };
//添加另一个对象(使用对的初化器列表)
j["object"] = { {"currency", "USD"}, {"value", 42.99} };
//相反,你也可写(与上面的`JSON`类似)
json j2 = {{"pi", 3.141},{"happy", true},{"name", "Niels"},{"nothing", nullptr},{"answer", {{"everything", 42}}},{"list", {1, 0, 2}},{"object", {{"currency", "USD"},{"value", 42.99}}}
};
注意,不需要"告诉"编译器要使用哪种JSON
值类型.如果想明确,可用json::array()
和json::object()
函数:
//一个表示空数组的方法`[]`
json empty_array_explicit = json::array();
//表达空对象`{}`的方法
json empty_object_implicit = json({});
json empty_object_explicit = json::object();//一个表示键/值对`数组[["`货币`","`美元`"],["`值`",42.99]]`的方法json array_not_object = json::array({ {"currency", "USD"}, {"value", 42.99} });
序化/反序化
可附加_json
到串字面
来创建JSON
值(反序化
):
//从串字面创建对象
json j = "{ \"happy\": true, \"pi\": 3.141 }"_json;
//甚至更好的原始串文字
auto j2 = R"({"happy": true,"pi": 3.141}
)"_json;
注意,如果不附加_json
后缀,则不会解析传递的串字面,而只是用作JSON
的串值.也即
json j = "{ \"happy\": true, \"pi\": 3.141 }";
只存储串"{"happy":true,"pi":3.141}"
而不解析
实际对象.如下引入串字面
.
using namespace nlohmann::literals;
上例也可用json::parse()
显式表示:
//显式解析
auto j3 = json::parse(R"({"happy": true, "pi": 3.141})");
还可取JSON
值的串表示
(序化):
//显式转换为串`{"happy":true,"pi":3.141}`序化,通过缩进的空格量打印
std::string s = j.dump(); //
std::cout << j.dump(4) << std::endl;
//`{"`快乐`":`真`,"`圆周率`":3.141}`
注意序化和赋值
间的区别:
//在`JSON`值中存储串
json j_string = "this is a string";
//提取串值
auto cpp_string = j_string.template get<std::string>();
//提取串值(变量已存在,时替代)
std::string cpp_string2;
j_string.get_to(cpp_string2);
//提取序化值(显式`JSON`序化)
std::string serialized_string = j_string.dump();
//原始串的输出
std::cout << cpp_string << " == " << cpp_string2 << " == " << j_string.template get<std::string>() << '\n';
//序化值的输出
std::cout << j_string << " == " << serialized_string << std::endl;
.dump()
返回最初存储的串值.
注意,该库仅支持UTF-8
.在库中用不同编码存储串时,调用dump()
可能会触发异常,除非json::error_handler_t::replace
或json::error_handler_t::ignore
用作错误处理器.
传入/传出流(如文件,串流)
还可用流
来序化和反序化
:
//从标准输入反序化
json j;
std::cin >> j;
//序化为标准输出
std::cout << j;
//`setw`机械手重载以设置漂亮的打印
std::cout << std::setw(4) << j << std::endl;
这些操作符适合std::istream
或std::ostream
的子类.下面是文件
的相同示例:
//读取`JSON`文件
std::ifstream i("file.json");
json j;
i >> j;
//修饰的`JSON`写入另一个文件
std::ofstream o("pretty.json");
o << std::setw(4) << j << std::endl;
从迭代器区间读取
你还可从迭代器区间解析JSON;
也即,从迭代器可访问的容器中,其value_type
是1,2
或4
个字节的整数类型,解释分别为UTF-8,UTF-16
和UTF-32
.
如,std::vector<std::uint8_t>
或std::list<std::uint16_t>
:
std::vector<std::uint8_t> v = {'t', 'r', 'u', 'e'};
json j = json::parse(v.begin(), v.end());
可把迭代器
保留在[开始,结束)
区间:
std::vector<std::uint8_t> v = {'t', 'r', 'u', 'e'};
json j = json::parse(v);
自定义数据源
因为parse
函数接受任意迭代器区间,因此你可通过实现LegacyInputIterator
概念来提供自己的数据源
.
struct MyContainer {void advance();const char& get_current();
};
struct MyIterator {using difference_type = std::ptrdiff_t;using value_type = char;using pointer = const char*;using reference = const char&;using iterator_category = std::input_iterator_tag;MyIterator& operator++() {MyContainer.advance();return *this;}bool operator!=(const MyIterator& rhs) const {return rhs.target != target;}reference operator*() const {return target.get_current();}MyContainer* target = nullptr;
};
MyIterator begin(MyContainer& tgt) {return MyIterator{&tgt};
}
MyIterator end(const MyContainer&) {return {};
}//开始,结束
void foo() {MyContainer c;json j = json::parse(c);
}
萨克斯接口
有类似SAX
的接口:
//解析空值时调用
bool null();
//解析布尔值时调用;传递值
bool boolean(bool val);
//解析有符号或正整数时调用;传递值
bool number_integer(number_integer_t val);
bool number_unsigned(number_unsigned_t val);
//解析浮点数时调用;传递值和原始串
bool number_float(number_float_t val, const string_t& s);
//解析串时调用;值被传递,可安全地移走
bool string(string_t& val);
//解析二进制值时调用;值被传递,可安全地移走
bool binary(binary_t& val);//在对象或数组开始或结束时调用,或.传递元质数(如果不知道,则为`-1`)
bool start_object(std::size_t elements);
bool end_object();
bool start_array(std::size_t elements);
bool end_array();
//解析对象键时调用;值被传递,可安全地移走
bool key(string_t& val);//解析错误时调用;字节位置,最后令牌和异常被传递bool parse_error(std::size_t position, const std::string& last_token, const detail::exception& ex);
每个函数的返回值
确定是否应继续解析
.
要实现你自己的SAX
处理器,请如下:
0,在类中实现SAX
接口.可用nlohmann::json_sax<json>
类作为基类,但也可用实现上述函数
并公开的类.
1,创建SAX
接口类的对象,如my_sax
.
2,调用bool json::sax_parse(input, &my_sax)
,第一个参数可是输入,如串或输入流
,第二个参数是指向SAX
接口指针.
3,注意,sax_parse
函数仅返回一个布尔值
,指示上次执行的SAX
事件的结果.它不返回json
值,由你决定如何处理SAX
事件.
此外,如果解析
错误,不会触发
异常,由你处理传递给parse_error
实现的异常对象.内部,见json_sax.hpp
文件.
类似STL
的访问
按类似STL
容器设计JSON
类.事实上,它满足可逆容器
要求.
//使用`push_back`创建数组
json j;
j.push_back("foo");
j.push_back(1);
j.push_back(true);
//也使用`emplace_back`
j.emplace_back(1.78);
//迭代数组
for (json::iterator it = j.begin(); it != j.end(); ++it) {std::cout << *it << '\n';
}
//基于区间的
for (auto& element : j) {std::cout << element << '\n';
}
//取置器
const auto tmp = j[0].template get<std::string>();
j[1] = 42;
bool foo = j.at(2);
//比较真其他东西4个项假`json::value_t::数组`数组又是空的方便的类型检查器
j == R"(["foo", 1, true, 1.78])"_json; //
j.size(); //
j.empty(); //
j.type(); //
j.clear(); //
//
j.is_null();
j.is_boolean();
j.is_number();
j.is_object();
j.is_array();
j.is_string();
//创建对象
json o;
o["foo"] = 23;
o["bar"] = false;
o["baz"] = 3.141;
//也使用`Emplace`.
o.emplace("weather", "sunny");
//对象的特殊迭代器成员函数
for (json::iterator it = o.begin(); it != o.end(); ++it) {std::cout << it.key() << " : " << it.value() << "\n";
}
//与区间相同的代码
for (auto& el : o.items()) {std::cout << el.key() << " : " << el.value() << "\n";
}
//使用结构化绑定更加轻松`(C++17)`
for (auto& [key, value] : o.items()) {std::cout << key << " : " << value << "\n";
}
//查找项
if (o.contains("foo")) {//有个带有`"FOO"`键的项
}
//或通过查找和迭代器
if (o.find("foo") != o.end()) {//有一个带有`"FOO"`键的项
}
//或使用`count()10`删除项更简单
int foo_present = o.count("foo"); //
int fob_present = o.count("fob"); //
//
o.erase("foo");
从STL
容器转换
序列容器(std::array,std::vector,std::deque,std::forward_list,std::list)
都可来创建JSON
数组(如,整数,浮点数,布尔值,串类型或本节中描述的STL
容器)可来创建JSON
数组.
这同样适合类似的关联容器(std::set,std::multiset,std::unordered_set,std::unordered_multiset),
但这时,数组元素的顺序根据元素在各个STL
容器中的排序方式.
std::vector<int> c_vector {1, 2, 3, 4};
json j_vec(c_vector);
//`[1,2,3,4]`
std::deque<double> c_deque {1.2, 2.3, 3.4, 5.6};
json j_deque(c_deque);
//`[1.2,2.3,3.4,5.6]`
std::list<bool> c_list {true, true, false, true};
json j_list(c_list);
//[真,真,假,真]
std::forward_list<int64_t> c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};
json j_flist(c_flist);
//`[12345678909876,23456789098765,34567890987654,45678909876543]`
std::array<unsigned long, 4> c_array {{1, 2, 3, 4}};
json j_array(c_array);
//`[1,2,3,4]`
std::set<std::string> c_set {"one", "two", "three", "four", "one"};
json j_set(c_set); //只使用"一"的一个项`["`四`","`一`","`三`","`二`"]`
//
std::unordered_set<std::string> c_uset {"one", "two", "three", "four", "one"};
json j_uset(c_uset); //"一"只使用一个项,也许`["`二`","`三`","`四`","`一`"]`
//
std::multiset<std::string> c_mset {"one", "two", "one", "four"};
json j_mset(c_mset); //"一"的两个项都可能使用`["`一`","`二`","`一`","`四`"]`
//
std::unordered_multiset<std::string> c_umset {"one", "two", "one", "four"};
json j_umset(c_umset); //"一"的两个项都可能使用`["`一`","`二`","`一`","`四`"]`
//
同样,关联键值容器(std::map,std::multimap,std::unordered_map,std::unordered_multimap)
的键可构造std::string
,其值可来构造JSON
值(见上例)都可来创建JSON
对象.
注意,在多重映射时,JSON
对象中仅使用一个键,该值根据STL
容器的内部顺序.
std::map<std::string, int> c_map { {"one", 1}, {"two", 2}, {"three", 3} };
json j_map(c_map);
//`{"`一`":1,"`三`":3,"`二`":2}`
std::unordered_map<const char*, double> c_umap { {"one", 1.2}, {"two", 2.3}, {"three", 3.4} };
json j_umap(c_umap);
//`{"`一`":1.2,"`二`":2.3,"`三`":3.4}`
std::multimap<std::string, bool> c_mmap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
json j_mmap(c_mmap); //只使用键"三"的一个项,也许`{"`一`":`真`,"`二`":`真`,"`三`":`真}
//
std::unordered_multimap<std::string, bool> c_ummap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
json j_ummap(c_ummap); //只使用键"三"的一个项,也许`{"`一`":`真`,"`二`":`真`,"`三`":`真}
//
相关文章:
2309json.nlohmann数格示例1
参考 示例 下面是一些示例,可让你了解如何使用该类. 除了以下示例之外,你可能还需要: ->检查文档 ->浏览独立示例文件 每个API函数(记录在API文档中)都有相应独立示例文件.如,emplace()函数有一个匹配的emplace.cpp示例文件. 从文件中读取JSON json类提供了操作JSON…...
你知道 delete 删除属性时的一些细节吗?
探究 delete 的一些细节,起源于刚刚做过的一道笔试,原题如下: a 1; const b 2; console.log(delete a); console.log(delete b); // 输出结果是? // 答:true false我可从来没用过 delete 的返回值,但凡…...
Blender入门——快捷键
视角控制 旋转视角:鼠标中键摁住即可旋转平移视角:shift中远近视角:中键滚动 物体控制 移动物体:G旋转物体:R缩放物体:S回复变换:AltG,R,S新建物体:shiftA复制物体:shiftD删除物体&a…...
实例讲解Spring boot动态切换数据源
前言 在公司的系统里,由于数据量较大,所以配置了多个数据源,它会根据用户所在的地区去查询那一个数据库,这样就产生了动态切换数据源的场景。 今天,就模拟一下在主库查询订单信息查询不到的时候,切换数据…...
调整网络时需要注意的事项
这段时间调整网络,涉及的计算机多,Vlan也多,不小心的动作会给自己造成很大的麻烦,因为毕竟我也只是一个网络的初学者,平时虽然是网管,只是作为一项普通的工作。 准备工作做得不细致,可能出现的问…...
OpenCV自学笔记二十二:绘图及交互
一、绘图基础 下面是关于OpenCV绘图基础函数的说明和举例: 1. cv2.line():绘制直线 cv2.line(img, pt1, pt2, color, thickness, lineType) - img: 需要绘制直线的图像。 - pt1: 直线起始点坐标。 - pt2: 直线结束点坐标。 - color: 直线颜色&…...
【自学开发之旅】Flask-会话保持-API授权-注册登录
http - 无状态-无法记录是否已经登陆过 #会话保持 – session cookie session – 保存一些在服务端 cookie – 保存一些数据在客户端 session在单独服务器D上保存,前面数个服务器A,B,C上去取就好了,业务解耦。—》》现在都是基于token的验证。 以上是基…...
数据结构与算法--排序算法复习
目录 1.三种常见的简单排序: 1.1冒泡排序 1.2 选择排序 1.3 插⼊排序 2 常见高级排序算法 2.1 希尔排序 2.2 快速排序 2.3 归并排序 2.4计数排序 先上结论: 1.三种常见的简单排序: 1.1冒泡排序 1.⾸先在未排序数组的⾸位开始&#…...
python随手小练1
题目: 使用python做一个简单的英雄联盟商城登录界面 具体操作: print("英雄联盟商城登录界面") print("~ * "*15 "~") #找其规律 a "1、用户登录" b "2、新用户注册" c "3、退出系统&quo…...
gym_unity学习笔记
最近学了一段时间gym_unity,把一些资料留在这里 实例 实例gym_unity训练RollerBall:https://blog.csdn.net/alibutter/article/details/120908687实例gyn_unity训练3DBall:https://zhuanlan.zhihu.com/p/554927641?utm_id0 源码࿱…...
(三十)大数据实战——HBase集成部署安装Phoenix
前言 Phoenix 是一个开源的分布式关系型数据库查询引擎,它基于 Apache HBase构建。它提供了在 Hadoop 生态系统中使用 SQL查询和事务处理的能力。本节内容我们主要介绍一下Hbase如何集成部署安装Phoenix服务工具,并集成hive框架,能够快速、灵…...
【Python基础】S01E03 元组
P01S03 元组 定义元组元组无法修改定义一个元素的元素 修改元组变量方案一:关联新元组方案二:转换为列表 列表是可修改的,对于处理网站的用户列表或游戏中的角色列表至关重要。然而我们有时候需要创建一系列不可修改的元素,元组可…...
【算法-双指针思想】
双指针思想 双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。 定义快慢指针 快指针: 寻找新数组的元素 ,新数组就是不含有目标元素的数组 慢指针: 指向更新 新数组下…...
uni-app实现点击复制按钮 复制内容
注意:uni.setClipboardData({})里面的data参数必须是字符串类型这个是大坑 第一种 <view>{{orderId}}</view> //复制的内容 <button click"copy(orderId)">复制</button>copy(value) {uni.setClipboardData({data: value , // 这里是个坑接…...
Qt5开发及实例V2.0-第十四章-Qt多国语言国际化
Qt5开发及实例V2.0-第十四章-Qt多国语言国际化 第14章 Qt 5多国语言国际化14.1 基本概念14.1.1 国际化支持的实现14.1.2 翻译工作:“*.qm”文件的生成 14.2 【实例】14.2.1 简单测试14.2.2 选择语言翻译文字 本章相关例程源码下载1.Qt5开发及实例_CH1401.rar 下载2.…...
嵌入式网络接口之MAC芯片与PHY芯片
目录 0. 参考文档 1.嵌入式网络接口简介 2.嵌入式网络硬件架构方案 2.1 SOC内未集成MAC芯片 2.2 SOC内集成MAC芯片 2.3 主流方案总结 2.3 参照实际网卡的说明 3.MII/RMII及MDIO接口 3.1 MII 3.2 RMII 3.3 MDIO 0. 参考文档 网卡构造:MAC与PHY的关系&…...
在华为云服务器上CentOS 7安装单机版Redis
https://redis.io/是官网地址。 点击右上角的Download。 可以进入https://redis.io/download/——Redis官网下载最新版的网址。 然后在https://redis.io/download/页面往下拉,点击下图超链接这里。 进入https://download.redis.io/releases/下载自己需要的安装…...
01_Bootstrap基础组件01
1 什么是 Bootstrap? Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使 Web 开发更加快捷。它对 HTML、CSS 和 JavaScript 进行了封装,使它们…...
Java:OGNL对象图导航语言基本使用示例
OGNL是Object Graphic Navigation Language(对象图导航语言) 文档 https://commons.apache.org/proper/commons-ognl/language-guide.htmlhttps://github.com/orphan-oss/ognlhttps://ognl.orphan.software/developer-guide 引入依赖 <!-- https://mvnrepository.com/ar…...
中科院预警名单
2023年预警名单 (fenqubiao.com) 如果论文投稿到中国科学院预警期刊,可能会面临以下情况: 1. 预警期刊一般审稿周期长,容易出现迟迟不见回音的情况。 2. 这类期刊的学术质量参差不齐,接受论文的学术标准可能不严格。 3. 预警期刊发表论文的学术影响力比较有限,不容易为作者…...
Qt QCustomPlot介绍
介绍 主要介绍qcustomplot及其用法 最新版本:QCustomPlot Patch Release 2.1.1//November 6, 2022 下载:https://www.qcustomplot.com/index.php/download 官网:https://www.qcustomplot.com/index.php 简单使用 mainwindow.h /**************************************…...
什么是CORS(跨源资源共享)?如何解决前端中的CORS问题?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CORS(跨源资源共享)⭐ 解决前端中的CORS问题的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为…...
C 初级学习笔记(基础)
目录 1.预处理器指令 预定义宏 预处理器运算符 (\) 参数化的宏 头文件 .h 引用头文件操作 2.函数(标识符&关键字&运算符)存储类 函数参数 a. 标识符&关键字 b. 运算符(算术、关系、逻辑、位、赋…...
Nodejs 相关知识
Nodejs是一个js运行环境,可以让js开发后端程序,实现几乎其他后端语言实现的所有功能,能够让js与其他后端语言平起平坐。 nodejs是基于v8引擎,v8是Google发布的开源js引擎,本身就是用于chrome浏览器的js解释部分&#…...
【vue+elementUI】输入框样式、选择器样式、树形选择器和下拉框样式修改
输入框样式、选择器样式和下拉框样式修改 1、输入框和选择器的样式修改:2、下拉弹框样式A. 选择器的下拉弹框样式修改B. 时间选择器的下拉弹框样式修改C. vue-treeselect树形下拉框样式 1、输入框和选择器的样式修改: 写在style中不能加scoped࿰…...
JavaScript - canvas - 放大镜
效果 示例 项目结构: 源码: <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>放大镜</title><style type"text/css">div {width: 200px;height: 200px;display: inline-bl…...
PY32F003F18之输入捕获
输入捕获是定时器的功能之一,配合外部引脚,捕获脉宽时间或采集周期。 CPU中的定时器最基本的功能就是计数功能,其次是输入捕获(IC),再次就是比较输出(OC),还有就是使用引脚对外部时钟进行计数,触发信号捕捉…...
科目三基础四项(一)
第一天,基础操作,仪表,方向,挡位 按照模块来 1、方向盘两手在两侧 编辑 转向时的角度,只用:向左540,向右180 向左打和向右打的角度要抵消,回正 掉头向左打满再回 注意…...
C语言入门Day_24 函数与指针
目录 前言: 1.指针和数组 2.函数和指针 3.易错点 4.思维导图 前言: 我们知道数组是用来存储多个数据的,以及我们可以用指针来指向一个变量。那么我们可以用指针来指向一个数组中的数据么? 指针除了可以像指向一个变量一样指…...
9月21日,每日信息差
今天是2023年9月21日,以下是为您准备的14条信息差 第一、谷歌高管已经广泛讨论了在2027年之前将博通作为人工智能芯片供应商的可能性 第二、清华系团队宣布研发出千亿参数“制药版ChatGPT”,覆盖药物立项、临床前研究、临床试验的各阶段,作…...
微商网站制作/天桥区seo全网宣传
android开发常用工具类...
做英文网站的流程/百度大搜是什么
小编今天为大家整理了大连市内五区70所初中近三年中考指标分配情况及分配依据。一起来看~注:往年数据仅供参考,旅顺中学指标数未纳入统计。指标生是啥指标到校 ,就是每年初中升高中录取时,从市内省级示范性高中招生计划中确定一定…...
厦门做百度推广的网站/网站域名怎么查询
转载于:https://blog.51cto.com/tblduan/1899202...
网站做权重有用吗/刷推广链接人数的软件
在项目中,经常会碰到往数据库中导入大量数据,以便利用sql进行数据分析。在导入数据的过程中会碰到一些需要解决的问题,这里结合导入一个大约4G的txt数据的实践,把碰到的问题以及解决方法展现出来,一方面自己做个总结记…...
阿里云突发性能适用于做网站吗/网站优化员seo招聘
一,阐述Linux HA Cluster的使用背景;HA简介1、高可用集群的定义 高可用集群,英文原文为High Availability Cluster,简称HACluster,简单的说,集群(cluster)就是一组计算机࿰…...
电脑如何做ppt模板下载网站/杭州推广平台有哪些
数位DP 问题 求区间[L,R][L, R][L,R]中满足条件的数有多少个, 0≤L≤R0 \le L \le R0≤L≤R,该条件与数位有关,比如不包含数字444。 思路 考虑函数cal(n)cal(n)cal(n)表示区间[0,n][0, n][0,n]中满足条件的数的个数,那么区间[…...