如何使用RapidJson读取和解析Json文件?

如何使用RapidJson读取和解析Json文件?

RapidJSON是一个高性能的C++ JSON库。它提供了一个快速且易于使用的界面用于解析和生成JSON。它小巧而完整,支持SAX和DOM方式的API。此外,它是自包含且仅有头文件的,不依赖于外部库,例如BOOST,甚至不依赖于STL。这里是使用RapidJSON解析JSON文件的示例。

示例1:

#include "rapidjson/document.h"
#include "rapidjson/filereadstream.h"

#include <cstdio>

int main()
{
    //打开文件
    FILE* fp = fopen("test.json", "rb");

    //将文件读入缓冲区
    char readBuffer[65536];
    rapidjson::FileReadStream is(fp, readBuffer,
                                 sizeof(readBuffer));

    //解析JSON文档
    rapidjson::Document doc;
    doc.ParseStream(is);

    //关闭文件
    fclose(fp);

    //使用文档中的数据
    // ...

    return 0;
}

此示例将名称为 “test.json” 的文件的内容读入缓冲区,然后使用ParseStream函数解析JSON文档。解析的文档存储在 rapidjson :: Document 对象中,该对象提供对JSON文档中数据的访问。您可以使用 rapidjson :: Document 类的各种成员函数访问文档中的数据。例如,要访问对象成员,可以使用GetObject函数,要访问数组成员,则可以使用GetArray函数。您还可以使用HasMember函数检查对象是否具有特定成员,以及使用Size函数获取数组的大小。以下是更详细的使用RapidJSON解析JSON文件的示例,其中解释了每个步骤:

示例2:

#include "rapidjson/document.h"
#include "rapidjson/filereadstream.h"
  
#include <cstdio>
#include <iostream>
  
int main()
{
    // 打开文件
    FILE* fp = fopen("test.json", "rb");
  
    // 检查文件是否成功打开
    if (!fp) {
        std::cerr << "错误:无法打开文件"
                  << std::endl;
        return 1;
    }
  
    // 将文件读入缓冲区
    char readBuffer[65536];
    rapidjson::FileReadStream is(fp, readBuffer,
                                 sizeof(readBuffer));
  
    // 解析 JSON 文件
    rapidjson::Document doc;
    doc.ParseStream(is);
  
    // 检查文档是否有效
    if (doc.HasParseError()) {
        std::cerr << "错误:无法解析 JSON 文档"
                  << std::endl;
        fclose(fp);
        return 1;
    }
  
    // 关闭文件
    fclose(fp);
  
    // 访问文档中的数据
    // 假设 JSON 文档具有以下结构:
    // {
    //   "name": "John Smith",
    //   "age": 30,
    //   "city": "New York",
    //   "skills": ["programming", "guitar", "singing"]
    // }
  
    // 获取 "name" 成员
    if (doc.HasMember("name") && doc["name"].IsString()) {
        std::string name = doc["name"].GetString();
        std::cout << "姓名:" << name << std::endl;
    }
  
    // 获取 "age" 成员
    if (doc.HasMember("age") && doc["age"].IsInt()) {
        int age = doc["age"].GetInt();
        std::cout << "年龄:" << age << std::endl;
    }
  
    // 获取 "city" 成员
    if (doc.HasMember("city") && doc["city"].IsString()) {
        std::string city = doc["city"].GetString();
        std::cout << "城市:" << city << std::endl;
    }
  
    // 获取 "skills" 数组
    if (doc.HasMember("skills")
        && doc["skills"].IsArray()) {
        const rapidjson::Value& skills = doc["skills"];
        std::cout << "技能:";
        for (rapidjson::SizeType i = 0; i < skills.Size();
             i++) {
            if (skills[i].IsString()) {
                std::string skill = skills[i].GetString();
                std::cout << skill << " ";
            }
        }
        std::cout << std::endl;
    }
  
    return 0;
}  

示例 test.json:

如何使用RapidJson读取和解析Json文件?

输出:

如何使用RapidJson读取和解析Json文件?

示例解释:

在这个例子中,我们首先使用 fopen 函数打开 “test.json” 文件。然后,我们使用 rapidjson::FileReadStream 类将文件的内容读入缓冲区。解析 JSON 文档意味着将 JSON 格式化字符串转换为 JSON 对象,以便在程序中访问和操作。RapidJSON 提供了几个用于解析 JSON 的函数,包括:

  • Parse:解析 JSON 字符串
  • ParseInsitu:就地解析 JSON 字符串(即,不制作字符串的副本)
  • ParseStream:从输入流解析 JSON 文档

一旦解析了 JSON 文档,您就可以使用 rapidjson::Document 类的各种成员函数访问文档中的数据。例如:

  • IsObject:如果文档是对象,则返回true。
  • IsArray:如果文档是数组,则返回true。
  • IsString:如果文档是字符串,则返回true。
  • IsNumber:如果文档是数字(整数或浮点数),则返回true。
  • IsBool:如果文档是布尔值,则返回true。
  • GetObject:返回文档中指定路径处的对象。
  • GetArray:返回文档中指定路径处的数组。
  • GetString:返回文档中指定路径处的字符串。
  • GetInt:返回文档中指定路径处的整数。
  • GetUint:返回文档中指定路径处的无符号整数。
  • GetInt64:返回文档中指定路径处的64位整数。
  • GetUint64:返回文档中指定路径处的64位无符号整数。
  • GetDouble:返回文档中指定路径处的双精度浮点数。
  • GetBool:返回文档中指定路径处的布尔值。

以下是使用这些函数访问JSON文档数据的例子:

示例3:

#include "rapidjson/document.h"
  
int main()
{
    // 解析JSON文档
    rapidjson::Document doc;
    doc.Parse("{\"name\":\"John\",\"age\":30,\"city\":"
              "\"New York\"}");
  
    // 访问文档中的数据
    if (doc.IsObject()) {
        // 获取"name"成员
        if (doc.HasMember("name") && doc["name"].IsString()) {
            std::string name = doc["name"].GetString();
            std::cout << "Name: " << name << std::endl;
            // 输出:Name: John
        }
  
        // 获取"age"成员
        if (doc.HasMember("age") && doc["age"].IsInt()) {
            int age = doc["age"].GetInt();
            std::cout << "Age: " << age << std::endl;
            // 输出:Age: 30
        }
  
        // 获取"city"成员
        if (doc.HasMember("city") && doc["city"].IsString()) {
            std::string city = doc["city"].GetString();
            std::cout << "City: " << city << std::endl;
            // 输出:City: New York
        }
    }
  
    return 0;
}  

输出:

这段代码使用rapidjson::Document对象的Parse()方法解析字符串文本{“name”:”John”,”age”:30,”city”:”New York”} 中包含的JSON文档。然后访问文档并提取“name”、“age”和“city”成员的值并打印到控制台。

如何使用RapidJson读取和解析Json文件?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程