21xrx.com
2024-06-03 09:51:06 Monday
登录
文章检索 我的文章 写文章
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文件的过程,并提高我们的解析技能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复