c++ nlohmann/json 及修改json文件中个别关键字 JSON的三种格式https://blog.csdn.net/daxiong0816/article/details/125132404

这篇具有很好参考价值的文章主要介绍了c++ nlohmann/json 及修改json文件中个别关键字 JSON的三种格式https://blog.csdn.net/daxiong0816/article/details/125132404。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(2条消息) nlohmann json使用_nlohmann::json_蜗牛单行道的博客-CSDN博客json为JavaScript object notation 是一种数据格式,逐渐替换掉了传统的xml 。json数据格式的属性名称和字符串值需要用双引号引起来,用单引号或者不用引号会导致读取数据错误。json的另外一个数据格式是数组,和javascript中的数组字面量相同。

使用Json的格式与解析方便的可以表示一个对象信息,json有两种格式:

json中不能有注释,undefined,只要涉及到字符串的就必须双引号

①对象格式:{"key1":obj,"key2":obj,"key3":obj...}、

②数组/集合格式:[obj,obj,obj...]。

json.parse()解析将字符串解析成对应的值,

例子:

将nlohmann/json: JSON for Modern C++ (github.com)

 中代码下载下来,然后将include文件夹添加到测试工程的包含路径下即可:

我是用的绝对路径:D:\excer\mfc\json\json\include\; 

c++ nlohmann/json 及修改json文件中个别关键字
JSON的三种格式https://blog.csdn.net/daxiong0816/article/details/125132404

 测试代码:

#include <iostream>
#include <fstream>
#include <ostream>
#include "json.hpp"
using json = nlohmann::json;

int main()
{
    std::cout << "Hello World!\n";

	//读取json文件--------------------------------
	std::ifstream f("example.json");
	json data = json::parse(f);
	double pi = data["pi"];
	bool td = false; 
	//td = data["happy"];
	if (!data["happy"].is_null())
	{
		td = data["happy"];
	}
	std::string sname = data["name"].get<std::string>(); ;
	std::cout << data;
	int c = 0;

	//输出json文件--------------------------------
	// create an empty structure (null)
	json j;

    //方式一---------------------------------------
	// add a number that is stored as double (note the implicit conversion of j to an object)
	j["pi"] = 3.141;

	// add a Boolean that is stored as bool
	j["happy"] = true;

	// add a string that is stored as std::string
	j["name"] = "Niels";

	// add another null object by passing nullptr
	j["nothing"] = nullptr;

	// add an object inside the object
	j["answer"]["everything"] = 42;

	// add an array that is stored as std::vector (using an initializer list)
	j["list"] = { 1, 0, 2 };

	// add another object (using an initializer list of pairs)
	j["object"] = { {"currency", "USD"}, {"value", 42.99} };

    //方式二---------------------------------------
	// instead, you could also write (which looks very similar to the JSON above)
	json j2 = {
	  {"pi", 3.141},
	  {"happy", true},
	  {"name", "Niels"},
	  {"nothing", nullptr},
	  {"answer", {
		{"everything", 42}
	  }},
	  {"list", {1, 0, 2}},
	  {"object", {
		{"currency", "USD"},
		{"value", 42.99}
	  }}
	};

	//输出到文件中
	std::ofstream fout("out.json");
	fout << std::setw(4)<< j;
	fout << std::setw(4) << j2;
	fout.close();

}

对应的:json格式

{
  "pi": 3.141,
  "happy": true,
  "name": "Niels",
  "nothing": null,
  "answer": {
    "everything": 42
  },
  "list": [1, 0, 2],
  "object": {
    "currency": "USD",
    "value": 42.99
  }
}

 异常处理:

标签(关键字)happy2不存在,只有标签(关键字)happy,如果执行该语句bool td = data["happy2"]; 在直接读取标签happy2则解析器会崩溃。

解决办法:下面先对标签判断一下是否为空,为空的话,就不要直接读取了。 标签不为空才能直接读取

//td = data["happy"];
	if (!data["happy"].is_null())//关键字不为空才能直接读取
	{
		td = data["happy"];
	}

或者用contain

if (js.contains("exposure"))
	{
		// expos = js["exposure"];//不建议
		//.get<std::string>()
		expos = js["exposure"].get<int>();//建议显示类型转换
		strTemp.Format(L"%d", expos);
		SetDlgItemText(IDC1_EDIT1, strTemp);;
	}

 

 异常2:修改json文件中个别关键字时

按照直接修改js["exposure"] = expos;写到json文件时,文件会出现重复的关键字,后面json再读取解析文件时就会崩溃,解决办法为: 先读json文件,然后解析,解析后赋值给中间变量,

修改中间变量中的关键字,然后再保存json文件就可以了。

std::ifstream ifs("config.json", std::ios::app);//先读json文件
	json ss = json::parse(ifs);//解析json文件
	json js = ss;//中间变量js
	//js = ss;
	CString strTemp;
	GetDlgItemText(IDC1_EDIT1, strTemp);
	int expos = _ttoi(strTemp);
	if (js.contains("exposure"))
	{
		js["exposure"] = expos;//修改中间变量js中关键字exposure
	}
	

	std::ofstream fs("config.json");//最后写json文件
	fs << std::setw(4)<< js << std::endl;;//setw(4) 是用于打印格式好看的 json 文件//使用 j.dump(4) 也是一样的效果
	//fs <<  js;
	fs.close();

参考:

Issues · nlohmann/json (github.com)https://github.com/nlohmann/json/issues/1475

主要看下面的文章:

写json格式

c++中nlohmann json的基本使用教程_C 语言_脚本之家 (jb51.net)

nlohmann/json: JSON for Modern C++ (github.com)https://github.com/nlohmann/json/tree/develop

JSON的三种格式https://blog.csdn.net/daxiong0816/article/details/125132404

json格式 (keoaeic.org)https://mip.keoaeic.org/unscramble_major/4394.htmlC++ json格式的书写_雪星途的博客-CSDN博客https://blog.csdn.net/weixin_45387966/article/details/122469835

(2条消息) nlohmann json使用_nlohmann::json_蜗牛单行道的博客-CSDN博客https://blog.csdn.net/qq_39568245/article/details/115312690?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-115312690-blog-121181848.235%5Ev38%5Epc_relevant_anti_vip_base&spm=1001.2101.3001.4242.1&utm_relevant_index=3文章来源地址https://www.toymoban.com/news/detail-481055.html

到了这里,关于c++ nlohmann/json 及修改json文件中个别关键字 JSON的三种格式https://blog.csdn.net/daxiong0816/article/details/125132404的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】requires关键字简介

    requires 是 C++20 中引入的一个新,用于在函数模板或类模板中声明所需的一组语义要求,它可以用来限制模板参数,类似于 typename 和 class 。 requires 常与 type_traits 头文件下类型检查函数匹配使用,当 requires 后的表达式值为 true 时满足 requires 条件,代表由其

    2024年02月04日
    浏览(37)
  • C++ 11 新特性 关键字

    我们先来看一段代码: 在这案例中,我们可以看到,声明为迭代器的变量前缀非常长,这样来写代码非常不美观,也不方便。auto的出现很大程度是为了解决该问题。 现在我们来回答刚才的问题: 在C++中, auto 是一个,它的作用是让编译器自动推导变量的类型,根据变

    2024年02月11日
    浏览(42)
  • C++系列:const关键字

    在学习C++时,const的知识点分散在书的各个章节。当我们尝试在编程时使用const时,总会感觉有一些细节被遗忘,因而不能得心应手地使用const。因此,本篇文章尝试着对const的做一些总结。参考书籍《C++ Primer Plus》 这里是我做的关于const的一些总结

    2024年03月09日
    浏览(47)
  • C++—static关键字详解

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 静态全局变量有以下特点: 1、该变量在全局数据区分配内存; 2、未经初始化的静态全局变量会被程序自动初始化为

    2024年02月15日
    浏览(37)
  • 【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

    在C语言中,同名函数是不能出现在同一作用域的,但是在C++中却可以,但是要满足函数重载的规则。 那什么是函数重载呢?它的规则是什么呢? 函数重载 :是函数的一种特殊情况,C++允许在 同一作用域 中声明几个功能类似的 同名函数 ,这些同名函数的 形参列表(参数个数

    2024年04月26日
    浏览(52)
  • 用python实现给出关键字查找并标注pdf文件中关键字

    要在Python中标注PDF文件中的,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现查找和标注功能: python 复制代码 import pdfminer   from pdf

    2024年01月16日
    浏览(71)
  • 【C++】const关键字的详解!!

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 const是永恒不

    2024年02月03日
    浏览(42)
  • Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 - type关键字和string类型

    本系列旨在介绍Json Schema的常见用法,以及.net实现库Lateapexearlyspeed.Json.Schema的使用 这篇文章将介绍Json Schema中的type,和string类型的常见验证功能。用例基于.net的LateApexEarlySpeed.Json.Schema nuget package。这是新创建的一个 Json Schema在.net下的高性能实现库。 就像其他各种Sch

    2024年02月02日
    浏览(42)
  • C++入门学习(八)sizeof关键字

    sizeof   是 C 和 C++ 中的一个运算符,用于确定特定类型或对象的内存大小(以字节为单位)。 1、查看数据类型占据内存大小 2、确定数组大小 3、确定结构体大小

    2024年01月21日
    浏览(40)
  • 【开懂C++】引用与关键字auto

    引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。注意引用的类型必须和变量类型相同,来演示下引用如何使用。 如上面的代码所示:我们给a取了个别名b,给b取别名c…也就是b是a的引用,c是b的引用…。 其实b,c,d都代表着a,它们都共用着一块内存空间

    2023年04月18日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包