json.hpp 库下载及安装

nlohmann json 的开源项目地址:

https://github.com/nlohmann/json#serialization–deserialization

对于我们项目中要使用 nlohmann json 工具,只需要引入 json.hpp 这一个文件,其中包含所有接口函数,正如其文档中所述 json.hpp 文件在 single_include/nlohmann 目录下,我们只需要下载该文件即可:

git clone https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp

注意:不是 include/nlohmann/json.hpp,而是 single_include/nlohmann/json.hpp,前者要包含整个文件夹,后者只需要包含 json.hpp 文件。

用 json 赋值

在使用 nlohmann JSON 库时,如果 JSON 中存储的类型与要赋值的变量类型一致,通常不需要显式地使用 get<>() 进行类型转换。at() 方法会返回一个 JSON 值对象,该对象可以直接赋值给与其类型兼容的变量。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <nlohmann/json.hpp>
#include <iostream>

int main() {
nlohmann::json j;
j["pi"] = 3.14159;
j["name"] = "GPT-4";

// 直接赋值
float pi = j.at("pi");
std::string name = j.at("name");

std::cout << "pi: " << pi << ", name: " << name << std::endl;

return 0;
}

在这个例子中,j.at("pi") 返回一个 JSON 值对象,该对象可以直接赋值给 float 类型的变量 pi,因为 JSON 中的值是一个浮点数。同样,j.at("name") 返回一个字符串,可以直接赋值给 std::string 类型的变量 name

注意事项

  1. 类型匹配:确保 JSON 中的值类型与变量类型匹配,否则会抛出异常。例如,如果 JSON 中的值是整数而你试图将其赋值给浮点数,可能会导致类型不匹配错误。

  2. 异常处理:使用 at() 方法时,如果键不存在,会抛出 std::out_of_range 异常。因此,确保键存在或使用异常处理机制。

  3. 类型安全:虽然可以直接赋值,但在某些情况下,显式使用 get<>() 可以提高代码的可读性和类型安全性,特别是在处理复杂数据结构时。

  4. char 类型nlohmann/json 库本身并没有直接支持 char 类型,所以需要转换,赋值给 json 时需要转换为 string 或者 int。