21xrx.com
2025-04-02 12:30:09 Wednesday
文章检索 我的文章 写文章
C++解析Json文件——基本方法和示例代码
2023-07-01 08:40:33 深夜i     --     --
C++ 解析 Json文件 方法 示例代码

当我们需要在C++程序中读取Json文件时,我们通常会用到一些工具和库来解析Json并将其转换为程序可用的数据结构。本文将介绍一些基本的方法和示例代码,帮助初学者更好地理解C++解析Json文件的过程。

1. 准备工作

在使用C++解析Json文件之前,我们需要先安装一个开源的Json C++库来处理Json数据。本文将使用RapidJSON库。通过提供高效的解析和生成Json数据的API,RapidJSON使得解析Json文件变得非常容易。为了开始使用RapidJSON,请下载并安装库文件,并设置相关的头文件和库文件路径。

2. 解析Json文件

下面是一个最简单的Json文件示例,以便我们更好地理解如何读取和解析它。

{
  "name": "Tom",
  "age": 25,
  "hobbies": ["music", "swim", "travel"]
}

我们可以使用RapidJSON提供的API来解析此Json文件并将其转换为C++中的数据结构,例如:

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
using namespace rapidjson;
int main() {
  // 读取Json
  const char* json = "{\"name\":\"Tom\",\"age\":25,\"hobbies\":[\"music\",\"swim\",\"travel\"]}";
  Document document;
  document.Parse(json);
  // 解析Json
  std::string name = document["name"].GetString();
  int age = document["age"].GetInt();
  const Value& hobbies = document["hobbies"];
  assert(hobbies.IsArray());
  
  for (SizeType i = 0; i < hobbies.Size(); i++){
    std::string val = hobbies[i].GetString();
  }
  // 输出解析结果
  printf("Name: %s \n", name.c_str());
  printf("Age: %d \n", age);
  return 0;
}

在此示例中,我们首先将Json文件作为字符串读入,并使用Document对象将其解析为Json对象。然后,我们可以使用Get函数将Json对象中的值转换为C++数据类型。例如,document["name"].GetString()将返回字符串类型的"name"键值。由于"hobbies"是一个数组,我们需要使用IsArray和Size函数访问其元素。

3. 更复杂的Json文件

如果我们需要解析更复杂的Json文件,可能需要更复杂的代码来实现。例如:

json
{
  "employees": [
    {
      "id": "001",
      "firstName": "John",
      "lastName": "Doe",
      "age": 25,
      "address":
        "city": "London",
      "phoneNumbers": [
        
          "number": "0123456789"
        ,
        
          "number": "0123456789"
        ,
        
          "number": "0123456789"
        
      ]
    },
    {
      "id": "002",
      "firstName": "Jane",
      "lastName": "Doe",
      "age": 30,
      "address":
        "postalCode": "NW8 9AY"
      ,
      "phoneNumbers": []
    }
  ]
}

我们需要使用递归方法来遍历并解析此Json文件,例如:

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
using namespace rapidjson;
void parsePhoneNumber(const Value& phoneNumber)
{
  std::string type = phoneNumber["type"].GetString();
  std::string number = phoneNumber["number"].GetString();
  printf("Type: %s\n", type.c_str());
  printf("Number: %s\n", number.c_str());
}
void parseAddress(const Value& address)
{
  std::string street = address["street"].GetString();
  std::string city = address["city"].GetString();
  std::string postalCode = address["postalCode"].GetString();
  printf("Street: %s\n", street.c_str());
  printf("City: %s\n", city.c_str());
  printf("PostalCode: %s\n", postalCode.c_str());
}
void parseEmployee(const Value& employee)
{
  std::string id = employee["id"].GetString();
  std::string firstName = employee["firstName"].GetString();
  std::string lastName = employee["lastName"].GetString();
  int age = employee["age"].GetInt();
  printf("Id: %s\n", id.c_str());
  printf("FirstName: %s\n", firstName.c_str());
  printf("LastName: %s\n", lastName.c_str());
  printf("Age: %d\n", age);
  const Value& address = employee["address"];
  parseAddress(address);
  const Value& phoneNumbers = employee["phoneNumbers"];
  assert(phoneNumbers.IsArray());
  for (SizeType i = 0; i < phoneNumbers.Size(); i++) {
    parsePhoneNumber(phoneNumbers[i]);
  }
}
int main()
{
  // 读取Json
  const char* json = "{
    "employees": [
      {
        "id": "001",
        "firstName": "John",
        "lastName": "Doe",
        "age": 25,
        "address":
          "city": "London",
        "phoneNumbers": [
          
            "number": "0123456789"
          ,
          
            "number": "0123456789"
          ,
          
            "type": "mobile"
        ]
      },
      {
        "id": "002",
        "firstName": "Jane",
        "lastName": "Doe",
        "age": 30,
        "address":
          "city": "London",
        "phoneNumbers": []
      }
    ]
  }";
  Document document;
  document.Parse(json);
  // 解析Json
  const Value& employees = document["employees"];
  assert(employees.IsArray());
  for (SizeType i = 0; i < employees.Size(); i++) {
    parseEmployee(employees[i]);
  }
  return 0;
}

在此示例中,我们定义了一个解析Json文件的递归函数,并使用递归方法访问Json文件中的嵌套元素。该示例使用了多个函数来解析Json文件和转换结果。我们可以使用递归方法来遍历嵌套的Json对象,从而更好地理解如何读取和处理Json文件。

总之,解析Json文件是C++编程中非常有用的技能之一。使用RapidJSON库,我们可以轻松地将Json文件转换为C++数据类型,并使用多种途径将其用于程序的不同方面。通过本文所介绍的基本方法和示例代码,我们可以更好地理解C++解析Json文件的过程,并提高我们的解析技能。

  
  

评论区