c++ nlohmann/json 及修改json文件中个别关键字

news2024/11/20 6:19:59

(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\; 

 测试代码:

#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django-初

文章目录 一、Django框架介绍二、后台管理第一步:项目的创建与运行第二步:应用的创建和使用第三步: 项目的数据库模型第四步: 启用后台Admin站点管理 三、前台管理第一步: URLconf 路由管理第二步: 视图函数处理业务逻辑第三步: 模板管理实现好看的HTML页面&#xff08;可参考菜…

网络计算模式期末复习(一)

C/S架构 C/S架构即客户端/服务端架构。客户端包含一个或多个在用户电脑上运行的程序&#xff0c;客户端程序发送请求和从服务器接收的数据。服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等。 B/S架构 B/S架构即浏览器/服务器架构&#xff0c;是随着Intern…

图片上添加贴纸怎么做?这几种方法很简单

在图片上添加贴纸是一种非常实用的图片编辑技巧&#xff0c;通过添加贴纸&#xff0c;图片可以变得更加生动有趣&#xff0c;吸引人们的眼球。贴纸可以是各种形状、颜色和大小&#xff0c;从而丰富图片的视觉效果。例如&#xff0c;在一张风景照片中添加一只卡通动物的图案&…

python中golbal的使用

简介 global关键字定义了一种在局部定义全局变量的方法 python中变量分为全局变量和局部变量&#xff0c;局部变量也叫做内部变量内部变量只能被内部使用&#xff0c;无法被其他函数或者对象使用 使用 简单使用 def fn():global fn_varfn_var "Hello World"fn1()…

为什么网红餐饮都做不长久?如何解决网红餐饮店所面临的问题?

随着社交媒体的兴起&#xff0c;网红餐饮在近年来越来越受到人们的关注。这些网红餐饮通常有着独特的装修风格、口味或者服务方式&#xff0c;吸引了大量的消费者前来体验。然而&#xff0c;有越来越多的网红餐饮因为各种原因而不得不倒闭&#xff0c;这引发了人们对于网红餐饮…

cajviewer怎么转换成pdf格式,分享几个方法给大家!

CAJViewer是一款常用的文献阅读软件&#xff0c;它主要用于打开和阅读中国知网等数据库中的CAJ格式文件。然而&#xff0c;有时候我们可能需要将这些CAJ文件转换为PDF格式&#xff0c;以便更方便地与他人分享或者进行打印。本文将介绍两到三种将CAJViewer文件转换为PDF格式的方…

华为OD机试真题2022Q4 A + 2023 B卷(JavaJavaScript)

大家好&#xff0c;我是哪吒。 五月份之前&#xff0c;如果你参加华为OD机试&#xff0c;收到的应该是2022Q4或2023Q1&#xff0c;这两个都是A卷题。 5月10日之后&#xff0c;很多小伙伴收到的是B卷&#xff0c;那么恭喜你看到本文了&#xff0c;抓紧刷题吧。B卷新题库正在更…

建站记录1:开通阿里云,购买域名,安装宝塔+LAMP系统

个人建站&#xff1a; 因为宝塔系统&#xff08;https://www.bt.cn&#xff09;&#xff0c;可以方便的部署zblog 彩色背景 什么是LAMP&#xff1f; Linux Apache PHP MySQL LAMP 是指Linux&#xff08;操作系统&#xff09; Apache &#xff08;HTTP 服务器&#xff09;…

batch_size对精确度和损失的影响

1 问题 在深度学习的学习过程中&#xff0c;模型性能对batchsize虽然没有学习率那么敏感&#xff0c;但是在进一步提升模型性能时&#xff0c;batch_size就会成为一个非常关键的参数。 batch_size对精度和损失的影响研究。 batch_size [,32,64,128&#xff0c;256] 不同batch_…

镕铭微电子VPU 极致降本增效实践

当前视频行业环境下&#xff0c;硬件芯片的机遇与挑战并存&#xff0c;如何使得硬件芯片产品及方案设计更好地贴近用户、服务用户及满足用户更深层次需求&#xff1f;本次LiveVideoStackCon 2022 北京站邀请到镕铭微电子解决方案架构总监——蔡媛Amy&#xff0c;为大家介绍镕铭…

【熬夜送书 | 第五期】清华社赞助 | 《MySQL系列丛书》

MySQL是什么? MySQL是一种关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在WEB应用方面&#xff0c;MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 MySQL有…

Arduino esp32 环境配置以及避坑指南

目录 环境配置安装 IDE下载固件 项目测试疑难解答micropython 固件冲突问题 环境配置 安装 IDE 参考文献&#xff1a;CSDN 首先下载 Arduino IDE 请注意&#xff0c;一定要选择 1.8 版本的&#xff0c;千万别用 2.0版本&#xff01;&#xff01;&#xff01; 建议直接下载 win…

通过向量回归、随机森林回归、线性回归和K-最近邻回归将预测结果绘制成图表进行展示

文章目录 表格部分数据如下运行效果如下代码解析完整代码附件 表格部分数据如下 附件里会给出全部数据链接 运行效果如下 代码解析 import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontPropertiesfont FontP…

webpack自动化打包webpack-dev-server

在前面的章节中我们每次改完要打包的资源文件&#xff0c;和配置文件都是是输入npx webpack命令手动打包的&#xff0c;那么有没有什么办法可以监听到我们代码的改动&#xff0c;在保存时就自动打包呢&#xff1f; 答案是当然有&#xff0c;不然哪些框架的脚手架是怎么实现保存…

Redis命令-数据结构String类型和Hash类型

1. String类型 字符串类型&#xff0c;Redis中最简单的存储类型 底层都是字节数组形式存储&#xff0c;只不过是编码方式不同&#xff1b; 字符串类型的最大空间不能超过512m&#xff1b; SET/GET/MSET/MGET使用示例&#xff1a; INCR使用示例&#xff1a; INCRBY自增并指定步长…

CSS粘性定位 - 它的真正工作原理!

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

STM32单片机蓝牙APP智能温控风扇红外热释电

实践制作DIY- GC0144-蓝牙APP智能温控风扇 基于STM32单片机设计---蓝牙APP智能温控风扇 二、功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C最小系统板DS18B20温度湿度OLEDHC-05蓝牙模块SR602红外热释电人体检测5V直流风扇多个按键&#xff08;开关键&#xff0c;下限减…

【WinForm项目】C#模拟交通信号灯|WinForm交通红绿灯

文章目录 前言一、运行效果二、界面设计三、代码&#xff1a;总结 前言 交通信号灯十字路口通行原理图。 实际上归类为四大类&#xff1a; 南北双向直行东西双向直行一对黑色粗线的左转一对红色粗线的左转。 状态逻辑图如下图所示&#xff1a;假定通行顺序为&#xff1a;南…

JavaWeb笔记(四)

前端基础 **提醒&#xff1a;**还没有申请到IDEA专业版本授权的同学要抓紧了&#xff0c;很快就需要用到。 经过前面基础内容的学习&#xff0c;现在我们就可以正式地进入Web开发的学习当中啦~ 本章节会讲解前端基础内容&#xff08;如果已经学习过&#xff0c;可以直接跳到…

一文说透:低代码开发平台和零代码平台区别是什么?

低代码开发平台和零代码平台区别是什么&#xff1f; 一个简单的例子就可以解释清楚。 假设你想入住一套新房&#xff0c;回看住房变迁史&#xff1a; 最原始方式是&#xff1a;自己建造往后一点&#xff0c;交付“毛坯房”&#xff1a;开发商统一建小区&#xff0c;不需要自…