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

C/C++讀寫JSON數(shù)據的詳細過程記錄

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

前言

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

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

第三方庫

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

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

2.編譯安裝

在linux平臺上的編譯過程如下:

# 安裝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)庫libjsoncpp.a在 jsoncpp-1.9.5/build/debug/lib目錄下。 執(zhí)行上述命令即可完成編譯,詳細說明可以點擊 此處查看

3.鏈接

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

可以通過以下命令鏈接

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

如果是使用xmake構建項目,則只需要在對應的target下面添加頭文件路徑,庫路徑,庫名稱,如下

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

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

jsoncpp基礎用法

在上述工作完成后,就可以在代碼中使用jsoncpp來完成對json的各種操作,下面我們來看下該庫對json的基本操作

1.從字符串中讀取json

1.1 簡單json數(shù)據 (單層數(shù)據)定義一個字符串來存儲json數(shù)據

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

使用json數(shù)據庫讀取字符串到json對象

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

  //從字符串中讀取數(shù)據  
  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ù)據

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

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

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

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é)點信息  
		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é)點信息  
		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;
   }
}

控制臺輸出

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文件

準備寫入的json內容

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

代碼

void writeFileJson()
{
	//根節(jié)點  
	Json::Value root;
 
	//根節(jié)點屬性  
	root["name"] = Json::Value("Derozan");
	root["age"] = Json::Value(27);
	root["sex"] = Json::Value("man");
 
	//子節(jié)點  
	Json::Value friends;
 
	//子節(jié)點屬性  
	friends["friend_name"] = Json::Value("Alen");
	friends["friend_age"] = Json::Value(35);
	friends["friend_sex"] = Json::Value("man");
 
	//子節(jié)點掛到根節(jié)點上  
	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;
 
	//縮進輸出  
	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();
}


//本來代碼來源于: 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"
}

總結

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

相關文章

  • 使用C++進行Cocos2d-x游戲開發(fā)入門過程中的要點解析

    使用C++進行Cocos2d-x游戲開發(fā)入門過程中的要點解析

    這篇文章主要介紹了使用C++進行Cocos2d-x游戲開發(fā)入門過程中的要點解析,主要針對畫面變化以及觸摸響應方面,需要的朋友可以參考下
    2015-12-12
  • C++ 復制控制之復制構造函數(shù)的實現(xiàn)

    C++ 復制控制之復制構造函數(shù)的實現(xiàn)

    所謂的“復制控制”即通過這三個成員函數(shù)控制對象復制的過程,本文主要介紹了C++ 復制控制之復制構造函數(shù)的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    這篇文章主要介紹了OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析,需要的朋友可以參考下
    2015-01-01
  • 用C語言實現(xiàn)單鏈表的各種操作(二)

    用C語言實現(xiàn)單鏈表的各種操作(二)

    本篇文章是對用C語言實現(xiàn)單鏈表的各種操作進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • c++對象內存布局示例詳解

    c++對象內存布局示例詳解

    C++類的內存布局跟結構體有點像,實際上,類中成員變量的內存布局規(guī)則跟結構體是一樣的,區(qū)別在于函數(shù),虛函數(shù)的放置,下面這篇文章主要給大家介紹了關于c++對象內存布局的相關資料,需要的朋友可以參考下
    2021-10-10
  • C++類繼承之子類調用父類的構造函數(shù)的實例詳解

    C++類繼承之子類調用父類的構造函數(shù)的實例詳解

    這篇文章主要介紹了C++類繼承之子類調用父類的構造函數(shù)的實例詳解的相關資料,希望通過本文大家能夠掌握C++類繼承的相關知識,需要的朋友可以參考下
    2017-09-09
  • C/C++中線程基本概念與創(chuàng)建詳解

    C/C++中線程基本概念與創(chuàng)建詳解

    線程是在進程中產生的一個執(zhí)行單元,是CPU調度和分配的最小單元,其在同一個進程中與其他線程并行運行,他們可以共享進程內的資源。本文就和大家一起聊聊線程基本概念以及如何創(chuàng)建多線程,需要的可以參考一下
    2022-09-09
  • C語言?for循環(huán)示例詳解

    C語言?for循環(huán)示例詳解

    本文將詳細介紹for循環(huán)的用法并提供相關的可編譯運行的C代碼示例,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2023-06-06
  • C語言利用鏈表與文件實現(xiàn)登錄注冊功能

    C語言利用鏈表與文件實現(xiàn)登錄注冊功能

    這篇文章主要介紹了C語言利用鏈表與文件實現(xiàn)登錄注冊功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++中拷貝構造函數(shù)的使用

    C++中拷貝構造函數(shù)的使用

    大家好,本篇文章主要講的是C++中拷貝構造函數(shù)的使用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02

最新評論

SHOW| 大新县| 富蕴县| 新化县| 钟山县| 漯河市| 无锡市| 夏河县| 鄂州市| 海城市| 乌鲁木齐县| 曲周县| 渭源县| 新巴尔虎左旗| 隆林| 德格县| 图们市| 思南县| 塔河县| 郁南县| 根河市| 双牌县| 太保市| 宁远县| 兴仁县| 北票市| 宜丰县| 芦山县| 南通市| 怀宁县| 平邑县| 宁化县| 历史| 霍州市| 房产| 湟中县| 子洲县| 贡觉县| 独山县| 桓仁| 阿巴嘎旗|