nlohmann/json的主要用法

阅读数:176 评论数:0

跳转到新版页面

分类

C/C++

正文

是一个用于解析json的开源c++库,是github上start最多的c++ 的json库,并且使用非常方便直观。

安装过程就不叙述了,不同的开发工具安装的过程也不太一样。

一、引入头文件

#include "nlohmann/json.hpp"

二、主要用法

1、声明与构造

json j1;
json j2 = json::object();
json j3 = json::array();

2、内容构造

json j = R"(
{
    "name": "Judd Trump",
    "credits": 1754500,
    "ranking": 1
}
)"_json;
	
或
	
json j{
    { "name", "Judd Trump"},
    { "credits", 1754500 },
    { "ranking", 1}
};

3、解析与序列化

(1)解析

std::string s = R"(
{
    "name": "Judd Trump",
    "credits": 1754500,
    "ranking": 1
}
)";
auto j = json::parse(s);

(2)序列化

 std::string s = j.dump();

(3)文件式

[
    {
        "name": "Judd Trump",
        "credits": 1754500,
        "ranking": 1
    },
    {
        "name": "Neil Robertson",
        "credits": 1040500,
        "ranking": 2
    },
    {
        "name": "Ronnie O'Sullivan",
        "credits": 954500,
        "ranking": 3
    }	
]
// 解析 
json j;
std::ifstream("c:\\rankings.json") >> j;
// 序列化
std::ofstream("d:\\rankings.json") << j;

4、引用和修改

json j{
        { "name", "Judd Trump"},
        { "credits", 1754500 },
        { "ranking", 1}
    };
   
    std::cout << j << endl;

    j["name"] = "Ding Junhui"; //j.at("name") = "Ding Junhui";   
    std::cout << j << endl;

5、转换成c++对象

(1)定义对象类型

struct Player{
    string name;
    int credits;
    int ranking;
};

(2)重载转换函数

void to_json(nlohmann::json& j, const Player& p) {
    j = json{  {"name", p.name}, {"credits", p.credits}, {"ranking", p.ranking} };
}

void from_json(const nlohmann::json& j, Player& p) {
    j.at("name").get_to(p.name);
    j.at("credits").get_to(p.credits);
    j.at("ranking").get_to(p.ranking);
}

(3)转换示例

auto j = R"([
        {
            "name": "Judd Trump",
            "credits": 1754500,
            "ranking": 1
        },
        {
            "name": "Neil Robertson",
            "credits": 1040500,
            "ranking": 2
        },
            {
            "name": "Ronnie O'Sullivan",
            "credits": 954500,
            "ranking": 3
        }    
        ])"_json; 
    
    std::vector<Player> players = j.get<std::vector<Player>>();
    std::cout << "name:    " << players[2].name << std::endl;
    std::cout << "credits: " << players[2].credits << std::endl;
    std::cout << "ranking: " << players[2].ranking << std::endl;

6、char数组转json对象

std::vector<char> jBuf(jLen - 4 + 1); // +1 为了空终止符
    if (inputFile.read(jBuf.data(), jLen - 4)) {
        jBuf[jLen - 4] = '\0'; // 确保以空终止符结尾
        try {
            json jsonObject = json::parse(jBuf.data());
            std::cout << "JSON 对象: " << jsonObject.dump(4) << std::endl;
        } catch (json::parse_error& e) {
            std::cerr << "JSON 解析错误: " << e.what() << std::endl;
            return 1;
        }
    } else {
        std::cerr << "读取 JSON 数据失败" << std::endl;
        return 1;
    }



相关推荐

第1章 认识对象 1.面向对象分析(object-oriented analysis,OOA)的主要任务是分析问题域中的对象、对象之间的关系,然后构造出该问题域的分析模型。分析

第一章 C++初步认识 C++对C的&ldquo;增强&rdquo;,表现在两个方面: (1)在原来面向过程的机制基础上,对C语言的功能做了不少扩展 <p

有一种特殊的指针叫做成员指针,它们通常指向一个类的成员,而不是对象中成员的特定实例。 <span styl

C++标准每5年会有一个新版本,1998年的C++98、2003年的C++03、2007年的C++TR1、2011年的C++11. 转换操作符 static_ca

组织和策略问题第0条 不要拘泥于小节(了解哪此东本西不应该标准化) 编程规范不应施加个人喜好或者过时的做法。第1条 在高警告级别干净利落地进行编译

它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把<span style="colo

1、C++版本更迭 <t

1、转换操作 (1)static_cast 将一个值以符合逻辑的方式转型。这个可以看作是&ldquo;利用原值重建一个临时对象,并在设立初值时使用型别转换&rdq

一、概述 GCC一般包括预处理、编译、组装和链接。GCC的运行一般是调用命令gcc,在cross-compiling时使用machine-gcc或machine-gcc-version,在使用c++时

一、概念 所谓的预编译头文件就是把工程中不会经常改变的代码预先编译好放在一个文件里(通过是以.pch为扩展名Precompiled heade