当前位置: 首页 > article >正文

C++ Json库的使用

1.Json库的使用,包含C++ Json的创建、读写、字符串Json互转等,覆盖日常使用场景

  • 前提:按照参考的文章部署好nlohmann/json

  • 上代码
#include <iostream>
#include <fstream>
#include "nlohmann/json.hpp"
using json = nlohmann::json;
using namespace std;

void CreateVoidJson(json& j)
{
	j["pi"] = 3.141;
	j["happy"] = true;
	j["name"] = "Niels";
	j["nothing"] = nullptr;
	j["answer"]["everything"] = 42; // 初始化answer对象
	j["list"] = { 1, 0, 2 }; // 使用列表初始化的方法对"list"数组初始化
	j["object"] = { {"currency", "USD"}, {"value", 42.99} }; // 初始化object对象
	cout << "-------------------------------  创建Json END  -------------------------------------------\n" << endl;
}

void PrintJsonInfo(json& j)
{
	float pi = j.at("pi");
	string name = j.at("name");
	int everything = j.at("answer").at("everything");
	cout << pi << endl; // 输出: 3.141
	cout << name << endl; // 输出: Niels
	cout << everything << endl; // 输出: 42
	// 打印"list"数组
	for (int i = 0; i < 3; i++)
		cout << j.at("list").at(i) << endl;
	// 打印"object"对象中的元素
	cout << j.at("object").at("currency") << endl; // 输出: USD
	cout << j.at("object").at("value") << endl; // 输出: 42.99
	cout << "-------------------------------  输出Json信息END  -------------------------------------------\n" << endl;
}

void OutputJson(json& j)
{
	ofstream file("Out.json");
	file << j << endl;
	cout << "\n-------------------------------  导出Json END  -------------------------------------------\n" << endl;
}

void JsonSwtichCString(json& j)
{
	//重载写法,返回一个Json对象
	j = "{\"happy\":true,\"pi\":3.141}"_json;
	auto j2 = R"({"happy":true,"pi":3.141})"_json;
	//或者
	string s = "{\"happy\":true,\"pi\":3.141}";
	auto j1 = json::parse(s.c_str());
	cout << j1.at("pi") << endl; // 输出:3.141
	//dump()返回 JSON 对象中存储的原始 string 值。
	s = j1.dump();
	cout << "dump()返回 JSON 对象中存储的原始 string 值:" << s << endl;
	cout << "-------------------------------  Json字符串互转 END  -------------------------------------------\n" << endl;
}

void ReadJsonFile()
{
	ifstream i("Out.json");
	json j;
	i >> j;
	// 以易于查看的方式将json对象写入到本地文件
	ofstream o("Out1.json");
	o << std::setw(4) << j << endl;
	cout << "-------------------------------  读入Json END  -------------------------------------------\n" << endl;
}

void JsonSwapType()
{
	// 首先定义一个结构体
	struct person
	{
		std::string name;
		std::string address;
		int age;
	};

	person p = { "Ned Flanders", "744 Evergreen Terrace", 60 }; // 定义初始化p

	// 从结构体转换到json对象
	json j;
	j["name"] = p.name;
	j["address"] = p.address;
	j["age"] = p.age;

	// 从json对象转换到结构体
	person p1
	{
		j["name"].get<std::string>(),
		j["address"].get<std::string>(),
		j["age"].get<int>()
	};
	cout << "-------------------------------  转换Json到结构体 END  -------------------------------------------" << endl;
}

int main()
{
	// 首先创建一个空的json对象
	json j; 
	CreateVoidJson(j);

	//打印Json信息
	PrintJsonInfo(j);

	//输出Json文件
	OutputJson(j);

	//Json对象和C字符串相互转换,最长使用的场景
	JsonSwtichCString(j);

	// 读取一个json文件,nlohmann会自动解析其中数据
	ReadJsonFile();

	//任意类型转换
	JsonSwapType();
	return 0;
}
  •  输出
-------------------------------  创建Json END  -------------------------------------------

3.141
Niels
42
1
0
2
"USD"
42.99
-------------------------------  输出Json信息END  -------------------------------------------


-------------------------------  导出Json END  -------------------------------------------

3.141
dump()返回 JSON 对象中存储的原始 string 值:{"happy":true,"pi":3.141}
-------------------------------  Json字符串互转 END  -------------------------------------------

-------------------------------  读入Json END  -------------------------------------------

-------------------------------  转换Json到结构体 END  -------------------------------------------

参考的文章:nlohmann入门使用总结

2.多层级Json读取

  • 多层级Json举例
{
  "output": {
    "width": 720,
    "height": 1080,
    "frameRate": 20,
    "crf": 31
  },
  "tracks": [
    {
      "name": "t1",
      "pieces": [
        {
          "file": "x.mp4",
          "startTime": 2,
          "endTime": 6
        },
        {
          "file": "y.mp4",
          "startTime": 9,
          "endTime": 13
        }
      ]
    },
    {
      "name": "t2",
      "pieces": [
        {
          "file": "z.mp4",
          "startTime": 0,
          "endTime": 10
        }
      ]
    }
  ]
}
  • C++代码解析
#include "nlohmann/json.hpp"
#include <fstream>
#include <iostream>

using json = nlohmann::json;

int main() {
    json j;
    std::ifstream jfile("test.json");
    jfile >> j;

    // 打印output对象【也可以用j["output"].at("width")】
    std::cout << j.at("output").at("width") << std::endl;
    std::cout << j.at("output").at("height") << std::endl;
    std::cout << j.at("output").at("frameRate") << std::endl;
    std::cout << j.at("output").at("crf") << std::endl;
    // 打印tracks数组对象
    for(int i=0; i<j["tracks"].size(); i++) {
        std::cout << j["tracks"][i].at("name") << std::endl;

        // 打印pieces子数组对象
        json j2 = j["tracks"][i].at("pieces");
        for(int k=0; k<j2.size(); k++) {
            std::cout << j2[k].at("file") << std::endl;
            std::cout << j2[k].at("startTime") << std::endl;
            std::cout << j2[k].at("endTime") << std::endl;
        }
    }

    return 0;
}

注:此部分代码参考1中的文章

3.推荐和参考:

rapidjson

  • RapidJSON: 首页
  • GitHub - Tencent/rapidjson: A fast JSON parser/generator for C++ with both SAX/DOM style API

 nlohmann/json

  • GitHub - nlohmann/json: JSON for Modern C++
  • nlohmann入门使用总结

 


http://www.kler.cn/a/487586.html

相关文章:

  • Git:Cherry-Pick 的使用场景及使用流程
  • 前端JavaScript中some方法的运用
  • AI时代来了,我们不再需要IDE了
  • python无需验证码免登录12306抢票 --selenium(2)
  • 在iStoreOS上安装Tailscale
  • IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡
  • C语言基础:野指针、空指针、空悬指针
  • 机器学习基础-贝叶斯分类器
  • 第 3 章 HTML5 编程基础教案
  • 【Elasticsearch7.11】postman批量导入少量数据
  • Spring/SpringBoot 的 自动装配与自动配置
  • 如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈
  • scala_【JVM】概述
  • Zabbix Api使用教程
  • 《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较
  • 微信小程序期末简答
  • vue+vite打包空白问题
  • Java 开发小技巧:使用 String.intern() 优化内存
  • antd-design-vue1.7.8浏览器中使用
  • P10424 [蓝桥杯 2024 省 B] 好数
  • 基于Springboot的景区民宿预约系统【附源码】
  • 理解Apache Spark中的宽窄依赖
  • LabVIEW瞬变电磁接收系统
  • Redis 优化秒杀(异步秒杀)
  • Debian source_list首次踩坑
  • 玩转 JMeter:Random Order Controller让测试“乱”出花样