C++操作.json文件的超详细新手教程

C++操作.json文件的超详细新手教程

什么是JSON文件?

JSON全称JavaScript Object Notation,是一种轻量级的数据交换格式。它基于JavaScript语言的一个子集,采用完全独立于编程语言的文本格式标准来表示数据。JSON实现简单,易于读写,同时易于机器解析和生成,因此成为前后端数据交互的重要工具。

选择合适的JSON库

C++中有许多JSON解析库,常用的有RapidJSON和Jsoncpp等。下面以RapidJSON为例,介绍如何操作JSON文件。

RapidJSON的安装和使用

安装

RapidJSON新版本在GitHub中可以获得,下载地址为:https://github.com/Tencent/rapidjson。下载后使用CMake进行编译,生成相应的库文件。

使用

使用RapidJSON很简单,只需包含相应的头文件:

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"

读取JSON文件

为了开发者的方便,RapidJSON提供了一个Document类,可以实现JSON字符串和JSON对象的转换。下面介绍如何从JSON文件中读取并分析其中的数据。

#include "rapidjson/document.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace rapidjson;
using namespace std;

string ReadJsonFile(const char* fileName) {
    ifstream ifs(fileName);
    if (!ifs.is_open()) {
        cerr << "Failed to open file: " << fileName << endl;
        return "";
    }
    string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
    ifs.close();
    return str;
}

int main() {
    // 读取JSON文件,获取其内容
    string jsonStr = ReadJsonFile("test.json");

    if (jsonStr.empty()) {
        cout << "Failed to read json file" << endl;
        return -1;
    }
    // 解析JSON
    Document doc;
    doc.Parse(jsonStr.c_str());

    if (!doc.IsObject()) {
        cout << "Json format error" << endl;
        return -1;
    }
    // 遍历JSON
    cout << "name:" << doc["name"].GetString() << endl;
    cout << "age:" << doc["age"].GetInt() << endl;
    cout << "is_student:" << (doc["is_student"].GetBool() ? "true" : "false") << endl;

    return 0;
}

上述代码中,ReadJsonFile函数实现对JSON文件的读取,然后通过Document类实现JSON转换,最后可以用下标操作符或者相应的Get函数获取JSON数据。

修改JSON文件

除读取外,也可以通过Document类实现JSON文件的修改。下面通过示例来演示如何修改JSON文件。

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace rapidjson;
using namespace std;

string ReadJsonFile(const char* fileName) {
    ifstream ifs(fileName);
    if (!ifs.is_open()) {
        cerr << "Failed to open file: " << fileName << endl;
        return "";
    }
    string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
    ifs.close();
    return str;
}

void WriteJsonFile(const char* fileName, const Document& doc) {
    ofstream ofs(fileName);
    if (!ofs.is_open()) {
        cerr << "Failed to create the output file" << endl;
        return;
    }
    StringBuffer sb;
    Writer<StringBuffer> writer(sb);
    doc.Accept(writer);
    ofs << sb.GetString();
    ofs.close();
}

int main() {
    // 读取JSON文件,获取其内容
    string jsonStr = ReadJsonFile("test.json");

    if (jsonStr.empty()) {
        cout << "Failed to read json file" << endl;
        return -1;
    }
    // 解析JSON
    Document doc;
    doc.Parse(jsonStr.c_str());

    if (!doc.IsObject()) {
        cout << "Json format error" << endl;
        return -1;
    }
    // 修改JSON
    doc["is_student"].SetBool(true);
    ++doc["age"].GetInt();

    // 将JSON写入文件
    WriteJsonFile("output.json", doc);

    return 0;
}

上述代码中,我们可以使用Document的SetBool和GetInt函数实现JSON的修改,然后使用WriteJsonFile函数将修改后的JSON写入文件中。需要注意的是,在修改完JSON后需要执行Accept函数,以将修改操作写入到内部数据结构中。

至此,C++操作JSON文件的超详细新手教程介绍完毕,希望对初学者有所帮助。

示例

示例1:读取状态数据

假设我们有一个名为“state.json”的JSON文件,该文件存储了用户的一些状态数据,包括是否已登录(Boolean类型)、金币数量(Integer类型)以及最近一次登录的日期时间(String类型),JSON形式如下:

{
  "is_login": true,
  "coin_num": 9999,
  "last_login": "2021-08-01 12:00:00"
}

我们可以通过下面的代码读取该JSON文件并修改其中的状态数据:

#include "rapidjson/document.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace rapidjson;
using namespace std;

string ReadJsonFile(const char* fileName) {
    ifstream ifs(fileName);
    if (!ifs.is_open()) {
        cerr << "Failed to open file: " << fileName << endl;
        return "";
    }
    string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
    ifs.close();
    return str;
}

int main() {
    // 读取JSON文件,获取其内容
    string jsonStr = ReadJsonFile("state.json");

    if (jsonStr.empty()) {
        cout << "Failed to read json file" << endl;
        return -1;
    }
    // 解析JSON
    Document doc;
    doc.Parse(jsonStr.c_str());

    if (!doc.IsObject()) {
        cout << "Json format error" << endl;
        return -1;
    }
    // 遍历JSON
    cout << "is_login:" << (doc["is_login"].GetBool() ? "true" : "false") << endl;
    cout << "coin_num:" << doc["coin_num"].GetInt() << endl;
    cout << "last_login:" << doc["last_login"].GetString() << endl;

    return 0;
}

示例2:修改状态数据

为了让状态数据更真实,我们需要将用户的金币数增加10000,而最近一次登录的日期时间需要更改为当前的日期时间。修改JSON文件的代码如下:

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <fstream>
#include <iostream>
#include <string>
#include <ctime>
using namespace rapidjson;
using namespace std;

string ReadJsonFile(const char* fileName) {
    ifstream ifs(fileName);
    if (!ifs.is_open()) {
        cerr << "Failed to open file: " << fileName << endl;
        return "";
    }
    string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
    ifs.close();
    return str;
}

void WriteJsonFile(const char* fileName, const Document& doc) {
    ofstream ofs(fileName);
    if (!ofs.is_open()) {
        cerr << "Failed to create the output file" << endl;
        return;
    }
    StringBuffer sb;
    Writer<StringBuffer> writer(sb);
    doc.Accept(writer);
    ofs << sb.GetString();
    ofs.close();
}

int main() {
    // 读取JSON文件,获取其内容
    string jsonStr = ReadJsonFile("state.json");

    if (jsonStr.empty()) {
        cout << "Failed to read json file" << endl;
        return -1;
    }
    // 解析JSON
    Document doc;
    doc.Parse(jsonStr.c_str());

    if (!doc.IsObject()) {
        cout << "Json format error" << endl;
        return -1;
    }
    // 修改JSON
    doc["coin_num"].SetInt(doc["coin_num"].GetInt() + 10000);
    time_t t = time(nullptr);
    char date[64];
    strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&t));
    doc["last_login"].SetString(date, strlen(date));

    // 将修改后的JSON写入文件
    WriteJsonFile("state_new.json", doc);

    return 0;
}

上述代码中,我们首先使用Document的SetInt和SetString函数实现JSON文件的修改。为使得最近一次登录的日期时间更为真实,我们使用了C++的标准时间库ctime实现currentTime获取。然后,我们再次调用自定义的WriteJsonFile函数将修改后的XML写入到一个新的JSON文件“state_new.json”中。

补充说明:

时间库ctime和localtime是C标准库里的内容,不是JSON库的内容,所以并不需要特殊安装或引用。

在代码中这样调用:

time_t t = time(nullptr);
char date[64];
strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&t));

其中,time函数返回的是当前时间的总秒数(自“2021-01-01 00:00:00”起),成为UTC时间。而strftime函数则可以将时间数据按指定格式打印输出。

在上述代码中,我们指定输出时间的格式为:“%Y-%m-%d %H:%M:%S”,即“年-月-日 时:分:秒”的形式。所以,date变量的输出格式则为:“2021-08-01 12:34:56”的形式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++操作.json文件的超详细新手教程 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++用new创建对象和不用new创建对象的区别解析

    C++中,我们可以通过new关键字来动态地创建对象。在new关键字的帮助下,我们可以在程序运行时动态地分配内存,并在该内存中创建一个新的对象。与此相对,我们也可以在静态方式下创建对象,即在栈空间中创建对象或全局空间创建对象。下面,我们将详细讲解C++中使用new关键字和静态方式创建对象的区别以及应用场景。 使用new创建对象的区别 内存分配位置不同:使用ne…

    C 2023年5月22日
    00
  • C语言围圈报数题目代码实现

    我先来介绍一下 “C语言围圈报数题目代码实现” 是什么: 这是一道经典的数学题目,题目有三个人围成一圈,他们报数,规定报到第三个人的时候要翻过去,也就是从头开始,如此循环,直到只剩下最后一个人。现在我们需要用C语言实现这个过程。 下面是该算法的完整实现,以及代码解析: 思路分析 1.将所有人简化为一个数组,数组的下标表示的是人的编号。2.从第k个人开始循环报…

    C 2023年5月24日
    00
  • C语言字符串原地压缩实现方法

    C语言字符串原地压缩实现方法 基本原理 C语言中的字符串实际上是字符数组,以’\0’结尾。要实现字符串的压缩,可以对字符数组进行压缩,即将连续重复的字符替换为该字符和重复次数的组合。 实现步骤 定义两个指针,一个指向原始的字符数组,另一个指向压缩后的字符数组的末尾。 定义一个计数器,用于统计连续相同字符的个数。 遍历原始字符数组,如果当前字符和上一个字符相同…

    C 2023年5月22日
    00
  • 详解C语言之顺序表

    详解C语言之顺序表 什么是顺序表? 顺序表是一种数据结构,它是由一块连续的存储空间表示的线性表,可以通过下标直接寻址访问表中元素。顺序表的插入和删除操作比较困难,但是查找操作比较容易。它是一种静态的数据结构,不能动态改变其大小。 实现顺序表的基本结构 在C语言中,我们可以用数组来实现顺序表的基本结构,如下所示: #define MAXSIZE 100 // …

    C 2023年5月24日
    00
  • 常用C/C++预处理指令详解

    常用C/C++预处理指令详解 什么是预处理指令? C/C++语言中,预处理指令是用于在实际编译前对代码进行预处理的指令。预处理器会在实际编译之前对指令进行展开、替换和操作。 常用预处理指令 #define #define指令是预处理中定义宏的指令,通过这个指令可以方便地定义常量、函数和表达式等。语法为#define 宏名 宏值,其中宏名为任意字母、数字、下划…

    C 2023年5月23日
    00
  • Javascript中的数学函数集合

    下面是Javascript中的数学函数集合的完整攻略: 数学函数集合 Javascript中有许多内置的数学函数,这些函数可以用来进行常见的数学计算。下面介绍一些常用的数学函数: Math.abs() Math.abs()函数用于返回一个数的绝对值。如果参数是正数,则返回其值;如果参数是负数,则返回其相反数。 console.log(Math.abs(-5)…

    C 2023年5月22日
    00
  • c++如何实现Base64算法

    C++如何实现Base64算法 Base64简介 Base64是一种将二进制数据编码成ASCII字符的方法,常用于在HTTP协议等网络协议中将二进制数据进行传输。 Base64将三个8位的字节转换为四个6位的字节,产生出来的输出结果最后可能会出现1~2个”=”号,这是为了补齐长度用的。 例如,“Man”这个单词被编码后为“TWFu”,解码后为”Man”。 C…

    C 2023年5月22日
    00
  • C语言 结构体(Struct)详解及示例代码

    C语言 结构体(Struct)详解及示例代码 什么是结构体(struct)? 结构体是C语言中一种构造类型(Compound Type),它可以将多个不同类型的变量组合成一个整体,方便在程序中进行操作。 一个结构体可以包含任意数量的成员变量,每个成员变量可以是基本类型,也可以是其他结构体类型。结构体定义语法如下: struct 结构体名称 { 数据类型 成员…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部