nlohmann/json 的用法示例

nlohmann/json 是一个C++实现的JSON解析器,使用非常方便直观。由于查看文档篇幅过长,不便于迅速阅读抓重点。而且,所举例的某些用法实践上其实比较少用到,而某些实践上常用到的一些用法,官网却缺例子。所以自己简要总结了一下它的主要用法,并加上自己写的示例,希望能给到新接触该库的朋友一些帮助。

下载使用方法

下载地址:

https://github.com/nlohmann/json/tree/develop/single_include/nlohmann/json.hpp

这是一个单独的C++头文件,所有的代码都在这个头文件里,实现代码都是内联实现,因此,只需要在CPP文件里包含这一个头文件即可。

引入头文件

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

使用示例:

1、声明与构造

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

2、内容构造

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

//或者
json j{
    { "name", "Judd Trump"},
    { "credits", 1754500 },
    { "ranking", 1}
};

 3、解析与序列化

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

//序列化
std::string str = j.dump();

 4、解析文件

假设一个JS文本文件 c:\test.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:\\test.json") >> j;

5、将JSON对象存为文件

json j;
std::ofstream("d:\\rankings.json") << j;

6、修改JSON对象

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

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

输出结果:

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

7、与C++对象互相转换

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

//1.重载转换函数
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);
}

//2.示例
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;

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值