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日

相关文章

  • php中json 序列化为 [] 的弊端

    首先,需要明确一下什么是 json序列化。json是一种轻量级的数据交换格式,是一种无状态、轻量级的数据交换格式,同时也容易读写和解析。在PHP中,通过 json_encode() 函数可以将一个PHP变量序列化为一个JSON格式的字符串,通过 json_decode() 函数可以将一个JSON格式的字符串重构为PHP变量。 现在回到问题本身,PHP中使用 …

    C 2023年5月23日
    00
  • C++实现图书管理系统简易版

    C++实现图书管理系统简易版攻略 前言 图书管理系统是一种基础的管理系统,它可以帮助管理员管理图书信息和读者信息,完成借阅、归还等基本操作。本文将详细介绍如何使用C++编程实现图书管理系统的简易版。 实现步骤 1. 确定需求 在编写代码之前,需要明确所要实现的功能需求。基本需求如下: 管理员可以添加图书和删除图书 管理员可以添加读者和删除读者 读者可以查询图…

    C 2023年5月24日
    00
  • C 位域

    下面我来详细讲解一下 “C 位域” 的使用攻略。 什么是 C 位域? C 位域(Bit Fields)是一种 C 语言中的结构体成员,它可以用来将一个内存单元中的多个位段来表示一个值。可以在结构定义中的成员后面加上冒号和一个数字,这个数字就表示这个成员要占用的位数。 C 位域的使用方法 C 位域的定义方法和普通的结构体成员一样,只是在成员后面加上冒号 “:”…

    C 2023年5月10日
    00
  • excel2json软件使用方法(Excel表快速转换成JSON字符串)

    下面为您详细讲解“excel2json软件使用方法”: 简介 excel2json是一款免费开源的轻量级工具,可以将Excel表格快速转换成JSON字符串格式,让开发者们更加便捷地使用表格数据。 下载安装 首先,在excel2json的官网上下载最新的可执行文件。 下载完毕后,解压缩文件并将excel2json.exe程序文件放置到您的电脑合适的位置。此时,…

    C 2023年5月23日
    00
  • C++实现十进制数转为其它进制数

    关于C++实现十进制数转为其他进制数的攻略,我将分为以下几个步骤进行介绍: 确定需要转换的十进制数以及目标进制数 使用循环和取模运算将十进制数转为目标进制数的各位数字 反转转换后的数字(可选) 输出转换后的数字(可选) 接下来我将详细讲解每一步的实现过程,并提供两个示例说明。 步骤1:确定需要转换的十进制数以及目标进制数 在进行进制转换之前,需要明确需要转换…

    C 2023年5月23日
    00
  • js中的json对象详细介绍

    下面我就来为你讲解一下“JS中的JSON对象详细介绍”的完整攻略。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言的一个子集,由Douglas Crockford在2001年提出。 JSON格式具有以下特点: 语法非常简单,易于阅读和编写。 可以表示简单的和复杂的数据…

    C 2023年5月23日
    00
  • C++特性之智能指针shared_ptr详解

    C++特性之智能指针shared_ptr详解 什么是智能指针? 智能指针是C ++中的一个重要特性,它可以避免内存泄漏和悬空指针的问题。智能指针是一个C ++类,它的析构函数自动释放分配的内存。最常见的智能指针有: unique_ptr shared_ptr weak_ptr 其中shared_ptr是引用计数智能指针。这种智能指针在控制对象之间的共享所有权…

    C 2023年5月22日
    00
  • GoLang函数与面向接口编程全面分析讲解

    下面我来详细讲解一下“GoLang函数与面向接口编程全面分析讲解”的完整攻略。 GoLang函数与面向接口编程全面分析讲解 一、GoLang函数的基本概念与使用 1.1 GoLang函数的定义 GoLang函数定义格式如下: func functionName(parameter1 parameter1Type, parameter2 parameter2T…

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