json解析数组 nlohmann_nlohmann/json 的主要用法

前言

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

准备工作:

引用头文件:

#include "nlohmann/json.hpp"

using json = nlohmann::json;

主要用法:

#1 声明与构造

##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}

};

#2 解析与序列化

字符串:

解析

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;

#3 引用和修改

举个栗子:

json j{

{"name", "Judd Trump"},

{"credits", 1754500},

{"ranking", 1}

};

std::cout<< j <

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}

#4 转换成C++对象

定义对象类型

structPlayer{stringname;intcredits;intranking;

};

重载转换函数

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 players = j.get<:vector>>();

std::cout<< "name:" << players[2].name <<:endl>

std::cout<< "credits:" << players[2].credits <<:endl>

std::cout<< "ranking:" << players[2].ranking << std::endl;

输出结果:

name: Ronnie O'Sullivan

credits: 954500

ranking: 3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值