2022-9-16-C++json库--nlohmann 学习

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 2022-9-16-C++json库--nlohmann 学习

前言

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 声明与构造

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

#4 转换成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


目录
相关文章
|
2月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
83 6
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
121 10
|
8天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
28 4
2023/11/10学习记录-C/C++对称分组加密DES
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
85 5
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
177 0
在Java中处理JSON数据:Jackson与Gson库比较
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
77 1
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
30 1
|
3月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
46 6
|
3月前
|
安全 C++
超级好用的C++实用库之环形内存池
超级好用的C++实用库之环形内存池
67 5