欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Jsoncpp的安裝與使用方式

 更新時間:2025年01月10日 11:13:45   作者:knight-n  
JsonCpp是一個用于解析和生成JSON數(shù)據(jù)的C++庫,它支持解析JSON文件或字符串到C++對象,以及將C++對象序列化回JSON格式,安裝JsonCpp可以通過命令安裝,默認(rèn)安裝動態(tài)庫,JsonCpp的使用主要涉及三個類:Json::Value用于表示JSON值

JsonCpp 是一個C++庫,用于解析和生成JSON數(shù)據(jù)。它支持解析JSON文件或字符串到C++對象,以及將C++對象序列化回JSON格式。

安裝Jsoncpp

我們可以輸入以下命令安裝jsoncpp庫。

sudo yum install -y jsoncpp-devel

安裝時默認(rèn)安裝動態(tài)庫。頭文件存儲在 /usr/include/jsoncpp/json 中。

庫文件存儲在 /lib64 中,我們可以簡單查看一下。

Jsoncpp的使用

對于 jsoncpp 我們只需要掌握三個類就可以覆蓋開發(fā)時的絕大多數(shù)場景。

  • Json::Value
  • 這是 JsonCpp 中最核心的類,用于表示 JSON 值。Json::Value 可以包含任何 JSON 類型的數(shù)據(jù):對象(一組鍵值對)、數(shù)組、字符串、數(shù)字、布爾值(true/false)、null 值。你可以使用這個類來創(chuàng)建、查詢和修改 JSON 數(shù)據(jù)。
  • Json::Reader
  • Json::Reader 類用于解析 JSON 字符串。你可以使用這個類將一個符合 JSON 格式的字符串解析成一個 Json::Value 對象。這個過程稱為 JSON 反序列化。
  • Json::Writer
  • Json::Writer 類用于將 Json::Value 對象轉(zhuǎn)換回 JSON 字符串。這個過程稱為 JSON 序列化。Json::Writer 還可以格式化 JSON 數(shù)據(jù),使其以易于閱讀的方式輸出。

Jsoncpp庫中的類定義在命名空間 Json 中 ,在使用時我們需要聲明命名空間。

Json 支持以下類型:

nullValue

空值
intValue有符號整數(shù)
uintValue無符號整數(shù)
realValue浮點數(shù)
stringValue字符串
booleanValue布爾數(shù)
arrayValue數(shù)組
objectValue鍵值對

Value類

Value 類是數(shù)據(jù)的容器,它支持存儲Json中的所有類型。Value為我們提供了各種類型的構(gòu)造函數(shù)。

構(gòu)造函數(shù)

默認(rèn)構(gòu)造函數(shù):

Json::Value value; //創(chuàng)建一個空的value對象

構(gòu)造一個具有特定類型的值:

Json::Value value(1); // 整數(shù) 
Json::Value value(1.0); // 浮點數(shù) 
Json::Value value("string"); // 字符串 
Json::Value value(true); // 布爾值

構(gòu)造一個數(shù)組或?qū)ο螅?/p>

Json::Value array(Json::arrayValue); // 空數(shù)組 
Json::Value object(Json::objectValue);// 空對象

復(fù)制構(gòu)造函數(shù):

Json::Value value1; Json::Value value2(value1); // value2 是 value1 的副本

構(gòu)造一個具有特定值的數(shù)組或?qū)ο螅?/p>

Json::Value array(Json::arrayValue); // 明確指定數(shù)組類型 
Json::Value object(Json::objectValue); // 明確指定對象類型

構(gòu)造一個包含初始值的數(shù)組或?qū)ο螅?/p>

Json::Value array(Json::arrayValue, 10); // 創(chuàng)建一個包含10個元素的數(shù)組,每個元素都是null
Json::Value object(Json::objectValue, 5); // 創(chuàng)建一個包含5個元素的對象

從另一個 JSON 值構(gòu)造:

Json::Value value1("initial value"); 
Json::Value value2 = value1; // value2 是 value1 的副本

Jsoncpp也為我們提供了一系列的檢測 Value 中存儲的值。這些接口都很簡單,從命名即可看出它們的作用,在此不過多介紹。

檢測保存的數(shù)據(jù)類型

bool isNull() const;
bool isBool() const;
bool isInt() const;
bool isInt64() const;
bool isUInt() const;
bool isUInt64() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;

當(dāng)我們從一個 Json::Value 對象中提取數(shù)據(jù)時,我們需要將它轉(zhuǎn)換為相應(yīng)的實際數(shù)據(jù)類型,同樣Jsoncpp 為我們提供了相應(yīng)的接口。

提取數(shù)據(jù)

// 將 Json::Value 對象轉(zhuǎn)換為 int 類型。
Int asInt() const;
// 將 Json::Value 對象轉(zhuǎn)換為 unsigned int 類型。
UInt asUInt() const;
// 將 Json::Value 對象轉(zhuǎn)換為 int64_t 類型。
Int64 asInt64() const;
// 將 Json::Value 對象轉(zhuǎn)換為 uint64_t 類型。
UInt64 asUInt64() const;
// 將 Json::Value 對象轉(zhuǎn)換為最大的整數(shù)類型(long long 類型)。
LargestInt asLargestInt() const;
// 將 Json::Value 對象轉(zhuǎn)換為最大的無符號整數(shù)類型(unsigned long long 類型)。
LargestUInt asLargestUInt() const;
// 將 Json::Value 對象轉(zhuǎn)換為 std::string 類型。
JSONCPP_STRING asString() const;
// 將 Json::Value 對象轉(zhuǎn)換為 float 類型。
float asFloat() const;
// 將 Json::Value 對象轉(zhuǎn)換為 double 類型。
double asDouble() const;
// 將 Json::Value 對象轉(zhuǎn)換為 bool 類型。
bool asBool() const;
// 將 Json::Value 對象轉(zhuǎn)換為 C 風(fēng)格的字符串(const char* 類型)。
const char* asCString() const;

在這些接口中,除了 asCString() 類型不匹配會返回空指針,其他接口在類型不匹配時都會則拋出 Json::TypeError。

這些接口都很簡單,我們可以簡單使用一下。

#include<jsoncpp/json/json.h>
#include<iostream>
using namespace Json;
int main()
{
    Value a(1234);
    if(a.isInt())
    {
        int b=a.asInt();
        std::cout << b << std::endl;
    }
    return 0;
}

因為 jsoncpp 是一個第三方庫,所以編譯時我們需要使用 -l 指定需要鏈接的庫。

g++ -o test jsontest.cpp -ljsoncpp

可以看到程序按預(yù)期輸出 1234 。

對于Json數(shù)組 Value 同樣有一系列接口。

對json數(shù)組的操作

Json數(shù)組可以存儲Json支持的所有類型,包括數(shù)組。

ArrayIndex size() const;

返回數(shù)組時的大小,即數(shù)組中的元素數(shù)量。

Value& operator[](ArrayIndex index);
Value& operator[](int index);

重載的 [] 運算符,用于訪問 Json::Value 對象作為數(shù)組時指定索引的元素。返回 Json::Value 對象的引用,允許修改。

const Value& operator[](ArrayIndex index) const;
const Value& operator[](int index) const;

重載的 [] 運算符,用于訪問 Json::Value 對象作為數(shù)組時指定索引的元素。返回 Json::Value 對象的常量引用,不允許修改。

Value get(ArrayIndex index, const Value& defaultValue) const;

使用指定的 index 下標(biāo)訪問 Json::Value 對象中的元素。如果 index 在有效范圍內(nèi),返回對應(yīng)的 Json::Value 對象。如果 index 無效,返回提供的 defaultValue。

Value& append(const Value& value);

向數(shù)組的末尾添加一個新元素,并返回對新元素的引用。

const_iterator begin() const;

返回一個迭代器,指向 Json::Value 對象作為數(shù)組或?qū)ο蟮牡谝粋€元素。這個迭代器是 const_iterator 類型,只能用于讀取元素。

const_iterator end() const;

返回一個迭代器,指向 Json::Value 對象數(shù)組或?qū)ο竽┪驳南乱粋€位置。這個迭代器是 const_iterator 類型,表示迭代結(jié)束的位置。

#include<jsoncpp/json/json.h>
#include<iostream>
using namespace Json;
int main()
{
    Value arr(arrayValue);
    Value a(1);
    Value b("hello world");
    arr.append(a);
    arr.append(b);

    int x=arr[0].asInt();
    const char* y=arr[1].asCString();

    std::cout << "arr[0]:" << x << std::endl;
    std::cout << "arr[1]:" << y << std::endl; 
    return 0;
}
iterator begin();

返回一個迭代器,指向 Json::Value 對象作為數(shù)組或?qū)ο蟮牡谝粋€元素。這個迭代器是 iterator 類型,允許修改元素。

iterator end();

返回一個迭代器,指向 Json::Value 對象數(shù)組或?qū)ο竽┪驳南乱粋€位置。這個迭代器是 iterator 類型,表示迭代結(jié)束的位置。

我們簡單使用一下:

#include<jsoncpp/json/json.h>
#include<iostream>
using namespace Json;
int main()
{
    Value arr(arrayValue);
    Value a(1);
    Value b("hello world");
    arr.append(a);
    arr.append(b);

    int x=arr[0].asInt();
    const char* y=arr[1].asCString();

    std::cout << "arr[0]:" << x << std::endl;
    std::cout << "arr[1]:" << y << std::endl; 
    return 0;
}

運行結(jié)果:

對Json對象的操作

JSON 對象由一系列鍵值對組成,其中每個鍵都是一個字符串,與一個值關(guān)聯(lián)。JSON 對象的鍵值對是無序的,這意味著鍵值對的順序可能會在不同的 JSON 對象中有所不同,但它們表示相同的數(shù)據(jù)。同時JSON 對象中的每個鍵都是唯一的,不允許有重復(fù)的鍵。

添加鍵值對

obj["key1"] = "value1"; // 使用操作符 [] 添加鍵值對 obj["key2"] = 123; // 鍵可以關(guān)聯(lián)不同類型的值

訪問值

Json::Value value = obj["key1"]; // 獲取鍵 "key1" 對應(yīng)的值

檢查鍵是否存在

if (obj.isMember("key1"))  // 鍵 "key1" 存在 

獲取所有鍵的名稱

Json::Value::Members members = obj.getMemberNames(); 
for (const auto& key : members) { std::cout << key << std::endl; }

Members是std::vector<std::string>的typedef別名。

修改值

obj["key1"] = "new value"; // 修改已存在的鍵 "key1" 對應(yīng)的值

刪除鍵值對

obj.removeMember("key1"); // 刪除鍵 "key1" 及其對應(yīng)的值

檢查 JSON 對象是否為空

bool isEmpty = obj.empty();

獲取 JSON 對象的大小

Json::ArrayIndex size = obj.size(); // 返回對象中鍵值對的數(shù)量

我們簡單演示一下使用。

#include<jsoncpp/json/json.h>
#include<iostream>
using namespace Json;
int main()
{
    Value obj(Json::objectValue);
    obj["age"]=18;
    obj["name"]="張三";
    Json::Value::Members members = obj.getMemberNames(); 
    for (const auto& key : members) 
    { 
        std::cout << key << std::endl; 
    }
    for (const auto &e : members)
    {
        std::cout << e << ":" << obj[e] << std::endl;
    }
    return 0;
}

我們運行一下。

Value也為我們提供了接口將對象序列化。

std::string toStyledString() const;

這個接口序列化出的字符串是帶縮進與換行的,我們簡單演示一下。

#include<jsoncpp/json/json.h>
#include<iostream>
#include<string>
using namespace Json;
int main()
{
    Value obj(Json::objectValue);
    obj["age"]=18;
    obj["name"]="張三";
    std::string s = obj.toStyledString();
    std::cout << s << std::endl;
    return 0;
}

運行結(jié)果

FastWriter類

在 JsonCpp 中,F(xiàn)astWriter可以將 Json::Value 對象轉(zhuǎn)換為 JSON 格式的字符串。與StyledStreamWriter 不同,F(xiàn)astWriter 不進行任何美化(不添加空格和縮進),因此通常會產(chǎn)生更緊湊的輸出,但寫入速度更快。在網(wǎng)絡(luò)通信中,我們通常用它將數(shù)據(jù)序列化為單行,便于進行網(wǎng)絡(luò)數(shù)據(jù)的傳輸。

std::string Json::FastWriter::write(const Value& root);

我們只需要掌握這一個接口即可,它會將傳入的對象序列化為單行的字符串。

我們簡單使用一下。

#include<jsoncpp/json/json.h>
#include<iostream>
#include<string>
using namespace Json;
int main()
{
    Value obj(Json::objectValue);
    obj["age"]=18;
    obj["name"]="張三";
    FastWriter writer;
    std::string s=writer.write(obj);
    std::cout << s ;
    return 0;
}

運行結(jié)果:

Reader類

有序列化,就有反序列化,在將Json對象進行序列化后,我們可以通過 read 類進行反序列化,

bool Json::Reader::parse(const std::string& document,Value& root, bool collectComments = true);

參數(shù):

  • document: json格式字符串
  • root: 傳出參數(shù), 存儲了json字符串中解析出的數(shù)據(jù)
  • collectComments: 是否保存json字符串中的注釋信息默認(rèn)true

parse有其他重載,但在這里我們不過多介紹。這里我們簡單演示一下parse的使用

#include<jsoncpp/json/json.h>
#include<iostream>
#include<string>
using namespace Json;
int main()
{
    Value obj(Json::objectValue);
    obj["age"]=18;
    obj["name"]="張三";
    FastWriter writer;
    std::string s=writer.write(obj);
    std::cout << s ;
    Reader reader;
    Value val;
    reader.parse(s,val);
    std::cout << val["age"] << std::endl;
    std::cout << val["name"] << std::endl;
    return 0;
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C基礎(chǔ) mariadb處理的簡單實例

    C基礎(chǔ) mariadb處理的簡單實例

    下面小編就為大家?guī)硪黄狢基礎(chǔ) mariadb處理的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • C++ windows LOG4plus的使用小結(jié)

    C++ windows LOG4plus的使用小結(jié)

    這篇文章主要介紹了C++ windows LOG4plus的使用小結(jié),本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • C++STL教程之vector模板的使用

    C++STL教程之vector模板的使用

    模板類vector是一個動態(tài)數(shù)組,類似于string類,可存放任意類型,能夠末尾、中間增加數(shù)據(jù),基本上是是new創(chuàng)建動態(tài)數(shù)組的替代品,vector可以自動完成new和delete
    2022-08-08
  • C++實例代碼詳解友元函數(shù)

    C++實例代碼詳解友元函數(shù)

    采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-06-06
  • VC++實現(xiàn)選擇排序算法簡單示例

    VC++實現(xiàn)選擇排序算法簡單示例

    這篇文章主要介紹了VC++實現(xiàn)選擇排序算法簡單示例,代碼簡潔易懂,有助于讀者對數(shù)據(jù)結(jié)構(gòu)與算法的學(xué)習(xí),需要的朋友可以參考下
    2014-08-08
  • C++實現(xiàn)ini文件讀寫的示例代碼

    C++實現(xiàn)ini文件讀寫的示例代碼

    這篇文章主要介紹了C++如何實現(xiàn)讀寫ini配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-05-05
  • linux根據(jù)pid獲取進程名和獲取進程pid(c語言獲取pid)

    linux根據(jù)pid獲取進程名和獲取進程pid(c語言獲取pid)

    status文件,第一行的Name即為進程名,C程序?qū)崿F(xiàn)根據(jù)PID獲取進程名和根據(jù)進程名獲取PID,大家參考使用吧
    2013-12-12
  • 關(guān)于C++中sort()函數(shù)的用法,你搞明白了沒

    關(guān)于C++中sort()函數(shù)的用法,你搞明白了沒

    這篇文章主要介紹了關(guān)于C++中sort()函數(shù)的用法,并通過三種方法介紹了按降序排列的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • C++中如何將數(shù)據(jù)保存為CSV文件

    C++中如何將數(shù)據(jù)保存為CSV文件

    這篇文章主要介紹了C++中如何將數(shù)據(jù)保存為CSV文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++使用宏實現(xiàn)動態(tài)庫加載

    C++使用宏實現(xiàn)動態(tài)庫加載

    開發(fā)的時候,有些項目不能靜態(tài)鏈接動態(tài)庫,需要程序運行時加載動態(tài)庫。本文將使用宏來實現(xiàn)動態(tài)庫的加載,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評論