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

2024-09-07 22:52

本文主要是介绍C++利用jsoncpp库实现写入和读取json文件(含中文处理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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;//stringroot["Address"] = "北京";//introot["Date"] = 1998;//arrayroot["Color"].append(0.8);root["Color"].append(1.0);root["Color"].append(0.5);//array-arrayroot["classIds"][0].append(0);root["classIds"][1].append(0);root["classIds"][1].append(1);//array-array-arraystd::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);//objectroot["Info"]["Class"] = "三年级";root["Info"]["School"] = "北京一中";//array-objectfor (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-8SetConsoleOutputCP(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)){//stringstd::string sAddress = rootValue["Address"].asString();std::cout << "Address = " << sAddress << std::endl;//int int nDate = rootValue["Date"].asInt();std::cout << "Date = " << nDate << std::endl;//arrayJson::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-arrayJson::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-arrayJson::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个regionif (!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;}}//objectstd::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-objectJson::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中文乱码问题

这篇关于C++利用jsoncpp库实现写入和读取json文件(含中文处理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146389

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo