1. 程式人生 > 實用技巧 >nlohmann/json 的主要用法

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 宣告與構造

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