C++ nlohmann/json 的主要用法

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ nlohmann/json 的主要用法相关的知识,希望对你有一定的参考价值。

前言

nlohmann/json 是一个用于解析json的开源c++库,口碑一流,号称有业界最好的性能,并且使用非常方便直观,是很多c++程序员的首选。开源官网处有详细说明用法,但篇幅过长,不便于迅速阅读抓重点。而且,所举例的某些用法实践上其实比较少用到,而某些实践上常用到的一些用法,官网却缺例子。所以自己简要总结了一下它的主要用法,并加上自己写的示例,希望能给到新接触该库的朋友一些帮助。

准备工作

下载 https://github.com/nlohmann/json/tree/develop/single_include/nlohmann/json.hpp, 并加入本地工程

我不知道怎么直接下载这个文件,用的拷贝这个文件内容然后自己新建文件的方法

引用头文件:

#include "nlohmann/json.hpp"
using json = nlohmann::json;

主要用法:

一、声明与构造

1 纯粹声明

#include "include/nlohmann/json.hpp"
using json = nlohmann::json;
#include <iostream>

int main() 

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

	std::cout << j1.type_name() << std::endl; // output: null
	std::cout << j2.type_name() << std::endl; // output: object
	std::cout << j3.type_name() << std::endl; // output: array
	return 0;

2 内容构造

#include "include/nlohmann/json.hpp"
using json = nlohmann::json;
#include <iostream>

int main() 

	json j1 = R"(
	
		"name": "Judd Trump",
		"credits": 1754500,
		"ranking": 1
	
	)"_json;

	json j2
	 "name", "Judd Trump",
	 "credits", 1754500 ,
	 "ranking", 1
	;

	std::cout << j1.type_name() << std::endl;	//object
	std::cout << j2.type_name() << std::endl;	//object

	return 0;

二、解析与序列化

字符串

解析
std::string s = R"(

    "name": "Judd Trump",
    "credits": 1754500,
    "ranking": 1

)";
auto j = json::parse(s);
序列化
std::string s = j.dump();

文件:// 比如有文件 c:\\rankings.json,其内容如下

[
    
        "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;

三、引用和修改

举个栗子:

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;

输出结果:

"credits":1754500,"name":"Judd Trump","ranking":1
"credits":1754500,"name":"Ding Junhui","ranking":1

四、转换成C++对象

定义对象类型

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

重载转换函数

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);

转换示例

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;

输出结果

name:    Ronnie O'Sullivan
credits: 954500
ranking: 3

参考文章:nlohmann/json 的主要用法

以上是关于C++ nlohmann/json 的主要用法的主要内容,如果未能解决你的问题,请参考以下文章

最好用的json库,也许是JSON for modern C++ 的最佳实践!解决nlohmann json中文无法解析的问题!

C++ nlohmann/json 如何使用运行时提供的 json_pointers 来读取 json 值

[C++][原创]nlohman的json简单使用

c++ nlohmann json保存二维数组

c++11:nlohmann::json进阶使用ordered_json

c++11:nlohmann::json进阶使用使用basic_json模板类