nlohmann json 学习

Posted by 周思进 on July 10, 2022

前面学了 JSON 基础,现在来学习下实际编程开发。

对于 C/C++ 开发人员,单从使用简单来讲,首选的应该是 nlohmann json 了,其官方网站:
https://json.nlohmann.me/

代码下载 github 地址:
https://github.com/nlohmann/json


一、下载使用

$wget https://github.com/nlohmann/json/archive/refs/tags/v3.10.5.tar.gz
$tar zxvf v3.10.5.tar.gz

将解压后的目录里的 include 目录下的内容直接拷贝到开发工程目录下,然后包含 “nlohmann/json.hpp” 头文件即可直接使用,具体如下:

#include "nlohmann/json.hpp"
#include <stdio.h>

using namespace nlohmann;

int main(int argc, char const *argv[]) {
    json j = R"(
    {
        "name":"一周思进",
        "age":30
    }
    )"_json;

    printf("%s\n", j.dump().c_str());

    return 0;
}

编译时需要启用 c++11,执行结果如下:

$make   
g++ -std=c++11 -I./ config.cpp
$./a.out 
{"age":30,"name":"一周思进"}

二、json 对象初始化

方式一、
json j = R"(
{
    "name":"一周思进",
    "age":30
}
)"_json;

R”()” 是 C++ 标准特性,用于嵌入原始字符串,即不做任何转义。
__json 附加在字符串后面用于对字符串进行反序列号,这样就转化成 json 对象了。

方式二:
json j = {
    {"name", "一周思进"},
    {"age", 30}
};
方式三:
json j;
j["name"] = "一周思进";
j["age"] = 30;

可以看出来这相当的简单,简单的赋值操作就可以了。

如果要创建个数组,则是需要调用 json::array(),如下:

json j = json::array[];
j[0]["name"] = "xiaozhou";
j[1]["name"] = "xiaoqiang";

如要获取数组的个数 j.size() 即可。


三、序列化和反序列化

序列化
json j = {
    {"name", "一周思进"},
    {"age", 30}
};
std::string s = j.dump();
反序列化
auto j = json::parse(R"({"name":"一周思进","age":30})");

四、JSON 对象解析

直接看示例代码

int main(int argc, char const *argv[]) {
    json j = {
        {"name", "一周思进"},
        {"age", 30}
    };

    // 字符串处理
    // 方式一
    std::string name_string;
    j["name"].get_to(name_string);
    printf("1name:%s\n", name_string.c_str());

    // 方式二
    auto name2_string = j["name"].get<std::string>();
    printf("2name:%s\n", name_string.c_str());

    // 整型处理
    // 方式一
    int age = j["age"];
    printf("1age:%d\n", age);

    // 方式二
    j["age"].get_to(age);
    printf("2age:%d\n", age);

    // 键不存在
    // 抛出异常
    try
    {
        j.at("test").get_to(age);
        printf("3age:%d\n", age);
    }
    catch(json::out_of_range& e)
    {
        printf("1parse error.\n");
    }
    return 0;
}

更多的接口操作需要看
https://json.nlohmann.me/api/basic_json/