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

C/C++讀寫JSON數(shù)據(jù)的詳細(xì)過(guò)程記錄

 更新時(shí)間:2023年04月25日 10:12:59   作者:Michael.Scofield  
JSON文件無(wú)論是在web開(kāi)發(fā)、客戶端開(kāi)發(fā)、服務(wù)端等開(kāi)發(fā)中都是應(yīng)用比較廣泛的的第一種輕量級(jí)數(shù)據(jù)交換格式,非常方便閱讀和編寫,下面這篇文章主要給大家介紹了關(guān)于C/C++讀寫JSON數(shù)據(jù)的詳細(xì)過(guò)程,需要的朋友可以參考下

前言

在進(jìn)行配置文件讀取或者進(jìn)行RPC(Remote Produce Call),我們需要在兩個(gè)進(jìn)程間傳遞大量的數(shù)據(jù),這時(shí)我們一般會(huì)選擇json/xml/protobuf來(lái)序列化數(shù)據(jù),加快數(shù)據(jù)的傳輸與解析速度。

JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。JSON采用完全獨(dú)立于語(yǔ)言的文本格式,這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。關(guān)于json數(shù)據(jù)格式的具體介紹,大家可以自己去搜索,今天主要介紹下C/C++如何借助第三方庫(kù)來(lái)解析json,進(jìn)而實(shí)現(xiàn)對(duì)json的讀寫。

第三方庫(kù)

C/C++本身沒(méi)有實(shí)現(xiàn)字符串到j(luò)son數(shù)據(jù)或者json數(shù)據(jù)到字符串的轉(zhuǎn)換,所以我們需要借助外部的第三方庫(kù)來(lái)實(shí)現(xiàn)這個(gè)功能,jsoncpp是一個(gè)由CPP實(shí)現(xiàn)的json數(shù)據(jù)解析庫(kù),通過(guò)這個(gè)靜態(tài)庫(kù)我們可以實(shí)現(xiàn)字符串到j(luò)son,json到字符串,以及讀寫json文件的功能。

1.下載 jsoncpp github源碼下載地址,目前已經(jīng)release了63個(gè)版本,可以選擇一個(gè)比較新的版本下載source code.

2.編譯安裝

在linux平臺(tái)上的編譯過(guò)程如下:

# 安裝cmkae
sudo apt-get install cmake

#在源碼目錄下創(chuàng)建指定目錄
cd jsoncpp-1.9.5/
mkdir -p build/debug

cd build/debug
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
make

編譯生成的靜態(tài)庫(kù)libjsoncpp.a在 jsoncpp-1.9.5/build/debug/lib目錄下。 執(zhí)行上述命令即可完成編譯,詳細(xì)說(shuō)明可以點(diǎn)擊 此處查看

3.鏈接

生成的libjsoncpp.a需要我們通過(guò)編譯命令鏈接到target中,同時(shí)指定頭文件搜索目錄,jsoncpp的頭文件保存在jsoncpp-1.9.5/include/json/include下,通常我們只用到json.h

可以通過(guò)以下命令鏈接

g++ -o xxx xxx.cpp -I頭文件搜索路徑 -L庫(kù)搜索路徑 -l庫(kù)名稱

如果是使用xmake構(gòu)建項(xiàng)目,則只需要在對(duì)應(yīng)的target下面添加頭文件路徑,庫(kù)路徑,庫(kù)名稱,如下

add_includedirs("header search path")
add_linkdirs("lib search path")
add_links("static/dynamic library name")

在我們的代碼中,需要添加jsoncpp的頭文件json.h

jsoncpp基礎(chǔ)用法

在上述工作完成后,就可以在代碼中使用jsoncpp來(lái)完成對(duì)json的各種操作,下面我們來(lái)看下該庫(kù)對(duì)json的基本操作

1.從字符串中讀取json

1.1 簡(jiǎn)單json數(shù)據(jù) (單層數(shù)據(jù))定義一個(gè)字符串來(lái)存儲(chǔ)json數(shù)據(jù)

{
    "name" : "DeRozan",
    "age" : "27",
    "sex" : "man"
}

使用json數(shù)據(jù)庫(kù)讀取字符串到j(luò)son對(duì)象

void readStrJson()
{
  const char* str =
    "{\"name\":\"DeRozan\",\"age\":21,\"sex\":\"man\"}";
  Json::Reader reader;
  Json::Value root;

  //從字符串中讀取數(shù)據(jù)  
  if (reader.parse(str, root))
  {
    string name = root["name"].asString();
    int age = root["age"].asInt();
    string sex = root["sex"].asString();
    cout << name + "," << age << "," << sex <<  endl;
  }
}

程序輸出

DeRozan,21,man

1.2 嵌套json數(shù)據(jù)

json中包含多層嵌套數(shù)據(jù)

{
    "name":"Derozan",
    "major":[
    {
        "Player":"LPL player"
    },
    {
        "Player":"Basketball Player"
    }]
}

使用jsoncpp讀取多級(jí)json數(shù)據(jù)

void readStrProJson()
{
	string strValue = "{\"name\":\"Derozan\",\"major\":[{\"LPL\":\"EDG player\"},{\"NBA\":\"Basketball Player\"}]}";
	Json::Reader reader;
	Json::Value value;
	if (reader.parse(strValue, value))
	{
		string out = value["name"].asString();
		cout << out << endl;
		const Json::Value arrayObj = value["major"];
		for (unsigned int i = 0; i < arrayObj.size(); i++)
		{
			out = arrayObj[i]["Player"].asString();
			cout << out<<endl;
		}
	}
}

程序輸出

DeRozan
LPL player
Basketball Player

2.從文件中讀取json

test.json

{
   "age" : 25,
   "friends" : {
      "friend_age" : 25,
      "friend_name" : "Derozan",
      "friend_sex" : "man"
   },
   "hobby" : [ "basket", "women", "sleep" ],
   "name" : "Alen",
   "sex" : "women"
}

#include <fstream>

void readFromFile() {
   Json::Reader reader;
   Json::Value root;
   const char* path = "/home/dexu_tian/Tmp/test.json";
   std::ifstream infile(path);
   if(reader.parse(infile, root)) {
    //讀取根節(jié)點(diǎn)信息  
		std::string name = root["name"].asString();
		int age = root["age"].asInt();
		std::string sex = root["sex"].asString();
		std::cout << "My name is " << name << std::endl;
		std::cout << "I'm " << age << " years old" << std::endl;
		std::cout << "I'm a " << sex << std::endl;
 
		//讀取子節(jié)點(diǎn)信息  
		std::string friend_name = root["friends"]["friend_name"].asString();
		int friend_age = root["friends"]["friend_age"].asInt();
		std::string friend_sex = root["friends"]["friend_sex"].asString();
		std::cout << "friend's name is " << friend_name << std::endl;
		std::cout << "friend's sex is "<<friend_sex << std::endl;
		std::cout << "friend is " << friend_age << " years old" << std::endl;
 
		//讀取數(shù)組信息  
		std::cout << "my hobby:" << std::endl;
		for (unsigned int i = 0; i < root["hobby"].size(); i++)
		{
			std::string ach = root["hobby"][i].asString();
			std::cout << ach << '\t';
		}
		std::cout << std::endl;
		std::cout << "Reading Success!" << std::endl;
   }
}

控制臺(tái)輸出

My name is Alen
I'm 25 years old
I'm a women
friend's name is Derozan
friend's sex is man
friend is 25 years old
my hobby:
basket  women   sleep
Reading Success!

3.寫入json文件

準(zhǔn)備寫入的json內(nèi)容

{
   "age" : 27,
   "friends" : {
      "friend_age" : 35,
      "friend_name" : "Alen",
      "friend_sex" : "man"
   },
   "hobby" : [ "Basketball", "Swimming", "game" ],
   "name" : "Derozan",
   "sex" : "man"
}

代碼

void writeFileJson()
{
	//根節(jié)點(diǎn)  
	Json::Value root;
 
	//根節(jié)點(diǎn)屬性  
	root["name"] = Json::Value("Derozan");
	root["age"] = Json::Value(27);
	root["sex"] = Json::Value("man");
 
	//子節(jié)點(diǎn)  
	Json::Value friends;
 
	//子節(jié)點(diǎn)屬性  
	friends["friend_name"] = Json::Value("Alen");
	friends["friend_age"] = Json::Value(35);
	friends["friend_sex"] = Json::Value("man");
 
	//子節(jié)點(diǎn)掛到根節(jié)點(diǎn)上  
	root["friends"] = Json::Value(friends);
 
	//數(shù)組形式  
	root["hobby"].append("Basketball");
	root["hobby"].append("Swimming");
	root["hobby"].append("game");
 
	//直接輸出  
	//cout << "FastWriter:" << endl;
	//Json::FastWriter fw;
	//cout << fw.write(root) << endl << endl;
 
	//縮進(jìn)輸出  
	std::cout << "StyledWriter:" << std::endl;
	Json::StyledWriter sw;
	std::cout << sw.write(root) << std::endl << std::endl;
 
	//輸出到文件  
	std::ofstream os;
    const char* path = "/home/dexu_tian/Tmp/testwrite.json";
	os.open(path, std::ios::out | std::ios::app);
	if (!os.is_open())
		std::cout << "error:can not find or create the file which named \" demo.json\"." << std::endl;
	os << sw.write(root);
	os.close();
}


//本來(lái)代碼來(lái)源于: https://blog.csdn.net/shuiyixin/article/details/89330529

查看寫入的文件

dexu_tian@VM-4-10-ubuntu:~/Tmp$ cat testwrite.json
{
   "age" : 27,
   "friends" : {
      "friend_age" : 35,
      "friend_name" : "Alen",
      "friend_sex" : "man"
   },
   "hobby" : [ "Basketball", "Swimming", "game" ],
   "name" : "Derozan",
   "sex" : "man"
}

總結(jié)

到此這篇關(guān)于C/C++讀寫JSON數(shù)據(jù)的文章就介紹到這了,更多相關(guān)C/C++讀寫JSON數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++遍歷磁盤驅(qū)動(dòng)器的示例代碼

    C++遍歷磁盤驅(qū)動(dòng)器的示例代碼

    這篇文章主要介紹了C++遍歷磁盤驅(qū)動(dòng)器的示例代碼,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-01-01
  • C語(yǔ)言零基礎(chǔ)入門(1)

    C語(yǔ)言零基礎(chǔ)入門(1)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言零基礎(chǔ)入門的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C語(yǔ)言合并兩個(gè)帶頭節(jié)點(diǎn)升序排列鏈表

    C語(yǔ)言合并兩個(gè)帶頭節(jié)點(diǎn)升序排列鏈表

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言合并兩個(gè)帶頭節(jié)點(diǎn)升序排列鏈表的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++中多線程間共享數(shù)據(jù)詳解

    C++中多線程間共享數(shù)據(jù)詳解

    這篇文章主要為大家詳細(xì)介紹了C++中多線程間共享數(shù)據(jù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Qt使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)增刪改查

    Qt使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)增刪改查

    這篇文章主要為大家詳細(xì)介紹了Qt如何使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)增刪改查功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • C++開(kāi)發(fā)之PugiXML庫(kù)基礎(chǔ)用法示例詳解

    C++開(kāi)發(fā)之PugiXML庫(kù)基礎(chǔ)用法示例詳解

    PugiXML庫(kù)是一個(gè)功能強(qiáng)大、簡(jiǎn)單易用的C++ XML解析庫(kù),它提供了一組方便的函數(shù)來(lái)解析、創(chuàng)建和修改XML文檔,本文介紹了如何使用PugiXML庫(kù)來(lái)解析、創(chuàng)建和修改XML文檔,以及如何處理錯(cuò)誤和異常,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • C/C++實(shí)現(xiàn)樹(shù)操作的實(shí)例代碼

    C/C++實(shí)現(xiàn)樹(shù)操作的實(shí)例代碼

    這篇文章主要介紹了C/C++實(shí)現(xiàn)樹(shù)操作的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 基于C++編寫一個(gè)鍵盤提示音程序

    基于C++編寫一個(gè)鍵盤提示音程序

    首先講一下思路,這次制作的小黑子相當(dāng)于鍵盤提示音,輸入J,N,T,M,會(huì)發(fā)出“雞你太美”的聲音,連續(xù)按下JNTM則會(huì)發(fā)出“你干嘛啊,哎呦”的聲音,感興趣的可以了解一下
    2023-03-03
  • 深入單鏈表的快速排序詳解

    深入單鏈表的快速排序詳解

    本篇文章是對(duì)單鏈表的快速排序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • QT中幾種常用的排序函數(shù)用法總結(jié)

    QT中幾種常用的排序函數(shù)用法總結(jié)

    Qt是目前最先進(jìn)、最完整的跨平臺(tái)C++開(kāi)發(fā)工具,下面這篇文章主要給大家介紹了關(guān)于QT中幾種常用的排序函數(shù)用法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評(píng)論