最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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;

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

#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 不進(jìn)行任何美化(不添加空格和縮進(jìn)),因此通常會產(chǎn)生更緊湊的輸出,但寫入速度更快。在網(wǎng)絡(luò)通信中,我們通常用它將數(shù)據(jù)序列化為單行,便于進(jìn)行網(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對象進(jìn)行序列化后,我們可以通過 read 類進(jìn)行反序列化,

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)文章

最新評論

驻马店市| 蒙阴县| 台州市| 张家港市| 德令哈市| 台中市| 新津县| 鄂托克前旗| 留坝县| 桐梓县| 聂荣县| 和静县| 汪清县| 岗巴县| 寿光市| 铁岭市| 临沧市| 卢氏县| 潞城市| 策勒县| 商水县| 湘潭县| 汉阴县| 石景山区| 义马市| 淮滨县| 商丘市| 会东县| 伊金霍洛旗| 长泰县| 腾冲县| 邵武市| 大竹县| 恭城| 沭阳县| 内江市| 武宣县| 北碚区| 亳州市| 舞阳县| 滁州市|