C++利用jsoncpp库实现写入和读取json文件(含中文处理)

news2024/9/20 8:02:14

C++利用jsoncpp库实现写入和读取json文件

  • 1 jsoncpp常用类
    • 1.1 Json::Value
    • 1.2 Json::Reader
    • 1.3 Json::Writer
  • 2 json文件
  • 3 写json文件
    • 3.1 linux存储结果
    • 3.2 windows存储结果
  • 3 读json文件
  • 4 读json字符串
  • 参考文章

在C++中使用跨平台的开源库JsonCpp,实现json的序列化和反序列化操作。

1 jsoncpp常用类

1.1 Json::Value

可以表示所有支持的类型:int、double、string、object、array等
节点的类型判断:isNull、isBool、isInt、isArray、isMember、isValidIndex
类型获取:type
类型转换:asInt、asString等
节点获取:get、[]
节点比较:<、<=、>、>=、==、!=
节点操作:compare、swap、removeMember、removeindex、append等函数。

1.2 Json::Reader

将文件流或字符串解析到Json::Value中,主要使用parse函数。

1.3 Json::Writer

将Json::Value转换成字符串流等,Writer类是一个纯虚类,不能直接使用。
使用 Json::Writer 的子类:
Json::FastWriter,将数据写入一行,没有格式
Json::StyledWriter,按json格式化输出,易于阅读

2 json文件

{
    "Address": "北京",
    "Date": 1998,
    "Color": [0.8, 1, 0.5],
    "classIds": [
        [0],
        [0,1]
    ],
    "regions": [
        [[420,200],[850,300],[1279,719],[640,719]],
        [[0,0],[500,0],[500,719],[0,719]]
    ],
    "Info": {
        "Class": "三年级",
        "School": "北京一中"
    },
    "Students": [
        {
            "Id": 1,
            "sex": "男",
            "ontime": true,
            "time": "2021-01-16"
        },
        {
            "Id": 2,
            "sex": "男",
            "ontime": true,
            "time": "2021-01-16"
        }
    ]
}

3 写json文件

#include"opencv2/opencv.hpp"
#include "json/json.h"
#include <fstream>
int main()
{
	std::string strFilePath = "test.json";
	Json::Value root;
	
	//string
	root["Address"] = "北京";
	
	//int
	root["Date"] = 1998;
	
	//array
	root["Color"].append(0.8);
	root["Color"].append(1.0);
	root["Color"].append(0.5);
	
	//array-array
	root["classIds"][0].append(0);
	root["classIds"][1].append(0);
	root["classIds"][1].append(1);

	//array-array-array
	std::vector<cv::Point> pts1 = { {420,200} ,{850,300},{1279,719},{640,719} };
	std::vector<cv::Point> pts2 = { {0,0} ,{500,0},{500,719},{0,719} };
	Json::Value region1, region2;
	for (auto& pt : pts1)
	{
		Json::Value jpt;
		jpt.append(pt.x);
		jpt.append(pt.y);
		region1.append(jpt);
	}
	for (auto& pt : pts2)
	{
		Json::Value jpt;
		jpt.append(pt.x);
		jpt.append(pt.y);
		region2.append(jpt);
	}
	root["regions"].append(region1);
	root["regions"].append(region2);

	//object
	root["Info"]["Class"] = "三年级";
	root["Info"]["School"] = "北京一中";

	//array-object
	for (int i = 0; i < 2; i++)
	{
		root["Students"][i]["Id"] = i + 1;
		root["Students"][i]["sex"] = "男";
		root["Students"][i]["ontime"] = true;
		root["Students"][i]["time"] = "2021-01-16";
	}

	Json::StreamWriterBuilder builder;
	//设置格式化字符串为空,默认设置为以"\t"格式化输出JSON
	//builder["indentation"] = "";//节省内存
	//JSONCPP默认编码是UTF8,与VS默认编码不一致,当输入中文时会出现乱码
	//StreamWriterBuilder提供设置默认编码的参数
	builder["emitUTF8"] = true;
	std::ofstream outFile(strFilePath);
	outFile << Json::writeString(builder, root);
	outFile.close();
	return 0;
}

在Linux系统运行时,存储的json文件中文正常显示。
在 windows系统运行时,“北京”存储为"\u5317\u4eac",读取时控制台可以正常显示中文字符。

3.1 linux存储结果

在这里插入图片描述

3.2 windows存储结果

在这里插入图片描述

3 读json文件

#include "json/json.h"
#include <fstream>
#include <Windows.h>
int main()
{
	//windows解决控制台中文乱码
	//引入Windows.h库,设置字符编码utf-8
	SetConsoleOutputCP(CP_UTF8);

	std::string strFilePath = "test.json";

	Json::Reader json_reader;
	Json::Value rootValue;

	std::ifstream infile(strFilePath.c_str(), std::ios::binary);
	if (!infile.is_open())
	{
		std::cout << "Open config json file failed!" << std::endl;
		return 0;
	}

	if (json_reader.parse(infile, rootValue))
	{
		//string
		std::string sAddress = rootValue["Address"].asString();
		std::cout << "Address = " << sAddress << std::endl;

		//int 
		int nDate = rootValue["Date"].asInt();
		std::cout << "Date = " << nDate << std::endl;

		//array
		Json::Value colorResult = rootValue["Color"];
		if (colorResult.isArray())
		{
			for (unsigned int i = 0; i < colorResult.size(); i++)
			{
				double dColor = colorResult[i].asDouble();
				std::cout << "Color = " << dColor << std::endl;
			}
		}
		//array-array
		Json::Value classIds = rootValue["classIds"];
		if (classIds.isArray()) {

			for (int i = 0; i < classIds.size(); i++)
			{
				Json::Value classId = classIds[i];//classIds中的第i个classId组合
				if (!classId.isArray())
					continue;
				std::cout << "classIds " << i << " : [ ";
				for (int j = 0; j < classId.size(); j++) {
					int id = classId[j].asInt();
					std::cout << id << ", ";
				}
				std::cout << "]" << std::endl;
			}
		}
		//array-array-array
		Json::Value regions = rootValue["regions"];
		if (regions.isArray()) {
			for (int i = 0; i < regions.size(); i++) {
				std::cout << "region " << i << " : ";
				Json::Value region = regions[i];//regions中的第i个region
				if (!region.isArray())
					continue;
				for (int j = 0; j < region.size(); j++)
				{
					Json::Value pt = region[j]; //region中的第j个点
					if (pt.isArray()) {
						int x = pt[0].asInt();
						int y = pt[1].asInt();
						std::cout << "[ " << x << ", " << y << " ],";
					}
				}
				std::cout << std::endl;
			}
		}
		//object
		std::string sSchool = rootValue["Info"]["Class"].asString();
		std::string sClass = rootValue["Info"]["School"].asString();
		std::cout << "Class = " << sClass << std::endl;
		std::cout << "School = " << sSchool << std::endl;

		// array-object
		Json::Value studentResult = rootValue["Students"];
		if (studentResult.isArray())
		{
			for (unsigned int i = 0; i < studentResult.size(); i++)
			{
				int nId = studentResult[i]["Id"].asInt();
				std::string sSex = studentResult[i]["sex"].asString();
				bool bOnTime = studentResult[i]["ontime"].asBool();
				std::string sTime = studentResult[i]["time"].asString();
				std::cout << "Student " << i << " : Id = " << nId << ", sex = " << sSex << ", bOnTime = " << bOnTime << ", Time = " << sTime << std::endl;
			}
		}
	}
	else
	{
		std::cout << "Can not parse Json file!";
	}

	infile.close();
	return 0;

在这里插入图片描述

4 读json字符串

数据在“名称/值” 对中,数据由逗号“ , ”分隔,使用斜杆来转义“ \” 字符,大括号 “{} ”保存对象。
json数据如下:

{
"name" : "测试",
"age" : "21",
"sex" : "男"
}
#include "json/json.h"
#include <fstream>
#include <Windows.h>
int main()
{
	SetConsoleOutputCP(CP_UTF8);

	Json::Reader json_reader;
	Json::Value rootValue;

    //字符串
    std::string str =
        "{\"name\":\"测试\",\"age\":21,\"sex\":\"男\"}";

    //从字符串中读取数据
    if (json_reader.parse(str, rootValue))
    {
        std::string name = rootValue["name"].asString();
        int age = rootValue["age"].asInt();
        std::string sex = rootValue["sex"].asString();
        std::cout << name + ", " << age << ", " << sex << std::endl;
    }
	return 0;

在这里插入图片描述

参考文章

vs2022控制台输出中文字符&存储中文字符
Jsoncpp用法小结 VS2019
C++利用jsoncpp库实现写入和读取json文件
C++ Builder 生成 json,Json::StreamWriterBuilder 参数详解
C++ Json中文乱码问题

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

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

相关文章

【有啥问啥】大模型应用中的哈希链推理任务

大模型应用中的哈希链推理任务 随着人工智能技术的快速发展&#xff0c;尤其是大模型&#xff08;如GPT、BERT、Vision Transformer等&#xff09;的广泛应用&#xff0c;确保数据处理和模型推理的透明性与安全性变得愈发重要。哈希链推理任务作为一种技术手段&#xff0c;能够…

会员营销如何利用JSON发送短信

在当今这个数字化时代&#xff0c;企业间的竞争日益激烈&#xff0c;如何高效地触达并维护用户群体&#xff0c;提升用户粘性和忠诚度&#xff0c;成为了每个企业都必须面对的重要课题。在众多营销手段中&#xff0c;会员营销因其精准性和个性化而备受青睐。而在会员营销的策略…

人工智能导论(上)

一、人工智能概述 人工智能这个基本概念的起源&#xff08;人工智能作为计算机科学的一个分支&#xff09; 很多应用研究领域都在人工智能的范畴里&#xff0c;比如机器人、语言识别、图像识别、自然语言处理和专家系统等等。更加通俗的说&#xff0c;人工智能是要让一部机器能…

传输层协议UDP

本篇将主要介绍 UDP 协议&#xff0c;介绍了有关 UDP 协议的报头、协议特点、UDP 协议在操作系统中的缓冲区、UDP 协议使用的注意事项&#xff0c;以及有关 UDP 的 Socket 编程程序&#xff0c;同时重点介绍了操作系统对于 UDP 协议报文的管理。 接着介绍了有关端口号的映射。 …

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设&#xff0c;如 DMA 控制器、 UART、IIC 等等。 在这些中断源中&#xff0c;UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中…

哲学概述2(马克)

三、哲学的基本问题 思维是主观的&#xff08;对应意识&#xff09; 存在是客观的&#xff0c;不以人的意志为转移&#xff08;对应物质&#xff09; 恩格斯说&#xff1a;“全部哲学&#xff0c;特别是近代哲学的重大的基本问题&#xff0c;是思维和存在的关系问题” 哲学的基…

HTML生日蛋糕

目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 HTML实现的生日蛋糕来喽&#xff0c;小编亲测&#xff0c;发给好友可以直接打开哦。在代码的第183行可以写下对朋友的祝福&#xff0c;快拿去送给你的好朋友吧&#xff01; 完整代码 <!DOCTYPE html>…

Python中的位运算-从入门到精通

你是否曾经好奇过计算机是如何在底层处理数据的?或者,你是否想知道为什么有些程序员总是津津乐道于位运算的强大?如果是,那么你来对地方了!今天,我们将深入探讨Python中的位运算,揭示它们的神奇之处,以及如何利用它们来优化你的代码。 目录 位运算:计算机的秘密语言为什么位…

JavaScript Web API入门day6

目录 1.正则表达式 1.1 什么是正则表达式 1.2 语法 1.3 元字符 1.3.1 边界符 1.3.2 量词 1.3.3 字符类 1.4 修饰符 1.5 案例 2.综合案例 2.1 小兔鲜页面注册 2.2 小兔鲜登录页面 2.3 小兔鲜首页页面 1.正则表达式 1.1 什么是正则表达式 正则表达式&#xff08;Re…

Chapter 12 Vue CLI脚手架组件化开发

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、项目目录结构二、组件化开发1. 组件化2. Vue 组件的基本结构3. 依赖包less & less-loader 前言 组件化开发是Vue.js的核心理念之一&#xff0c;Vue CLI为开发者提…

会声会影哪个版本最新

会声会影2023永久免费版能通过多种不同的特效的添加和项目的编辑和处理&#xff0c;能迅速的帮助用户能实现多种不同格式下的结果的提升&#xff0c;让用户能直接的完成相应的帮助和完善提升。 会声会影2023永久免费版简介&#xff1a; 会声会影2023永久免费版是一款简单的视频…

多模态在京东内容算法上的应用

多模态在京东内容算法上的应用 作者&#xff1a;京东零售技术 2024-09-04 北京 本文字数&#xff1a;5226 字 阅读完需&#xff1a;约 17 分钟 本文作者唐烨参与 DataFunsummit2024&#xff1a;推荐系统架构峰会&#xff0c;在专题【多模态推荐论坛】中分享了多模态算法在京…

如何在Word中插入复选框

如何在Word中插入复选框&#xff1a;详细教程与技巧 在Word中插入复选框是一项非常实用的技巧&#xff0c;尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时&#xff0c;复选框不仅能提高文档的功能性&#xff0c;还能显得更加专业。本文将详细讲解…

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉&#xff1a;生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐&#xff08;Biten et al.&#xff0c;2022&#xff09;或通过数据增强减少对象共现模…

各类AI工具编程能力测试对比

各类AI工具编程能力对比 现在各类AI工具火爆&#xff0c;擅长各类问题解决&#xff0c;闲来无事&#xff0c;验证下各类AI工具的编程能力如何。问题&#xff1a;c 实现杨辉三角&#xff0c;并main函数测试 kimi 对话窗口输入问题&#xff0c;得到了c的完整程序&#xff1a; …

JS面试真题 part2

JS面试真题 part2 6、typeof 与 instanceof 区别7、JavaScript原型&#xff0c;原型链&#xff1f;有什么特点8、说说你对作用域链的理解9、谈谈this对象的理解10、说说new操作符具体干了什么 6、typeof 与 instanceof 区别 自己回答&#xff1a; typeof&#xff1a;用来判断数…

SLM561A​​系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …

数字证书与公钥基础设施

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;数字证书 数字证书是由第三方可信机构&#xff08;一般是证书服务器&#xff09;颁发的数字证书&#xff0c;可以证明身份的可信度。 数字证书具有以下特点以及性质&#xff1a…

对极约束及其性质 —— 公式详细推导

Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式&#xff08;一&#xff09;程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例…