1. 程式人生 > >JsonCpp使用細談(Windows平臺)

JsonCpp使用細談(Windows平臺)

JSON:(JavaScript Object Notation)是基於Javascript的一種輕量級的資料交換格式,易於讀寫同時也易於機器解析和生成。具體詳細有關Json的資訊可參考JSON官網:http://www.json.org。

Json也是一種跨平臺多語音的資料交換格式,本文僅說明Windows平臺下的Json使用介紹。

Json的資料文字類似於一個MAP,資料儲存中key/value對中,key和value 中間用冒號間隔,key/value資料對之間以逗號分隔,同時支援類似於C語言的陣列字串格式,用花括弧{}表示物件,中括號[]表示陣列。如:

“firstName”:"Zhan" //表示Key/Value

{

"Sex":"male",

"age":18,

"name":"xiaohua"

}  //標書一個物件,物件有三個屬性

[

{"Sex":"male"},

{“Sex”:"female"}

]//表示一個數組

編譯方法:

1、開啟資料夾下\jsoncpp\makefiles\vs71的jsoncpp.sln工程,編譯該工程生成使用json必須的靜態lib,lib-json.lib(名稱可以修改),需要注意的是,需要將jsconcpp的工程屬性中的RunTime Library 修改為Multi-threaded Debug (/MTd),將生成的lib檔案拷貝到你的工廠目錄中去

2、Json提供了一個整合的方法不必把所有原始碼都包含到你的專案中,僅通過連結一個Jsoncpp的lib檔案,包含兩個個頭檔案,和一個cpp到專案中即可方便的使用JSON的功能。

編譯環境要求你的PC中安裝了Python,在Json的根目錄下執行 python amalgamate.py,執行該指令碼會在根目錄中生產一個dist目錄,該目錄包含了使用JSON的兩個標頭檔案json.h json-forwards.h jsoncpp.cpp三個檔案,將dist目錄拷貝到你的工程目錄環境中。

(當然你也可以將JSONCPP的原始碼一起加入到你的工程中,跟你的程式碼一起編譯)

通過以上兩步你就可以任性的使用JSON這種輕量級的資料傳輸格式傳輸你想要的資料了。

Json 使用例項:

  JSON使用過程中最重要的幾個物件時Json::Value 程式碼JSON的一個物件,Json::Reader JSon的序列化物件,Json::Writer JSON的反序列化物件,通過使用以上三個物件和物件的成員方法你基本可以完成json提供的一些功能了,本文列出了三個小例子,僅供參考,更多詳細內容請參閱JSON的參考文件

1、從字串中解析JSON

void ParseJsonFromStr()
{
	const char* str = "{\"name\":\"xiaoming\",\"age\":18}";
	Json::Value root;
	Json::Reader reader;
	if (!reader.parse(str, root))
	{
		cout << "Parse from str failed\n";
		return;
	}
	
	string name = root["name"].asCString();
	int age = root["age"].asInt();
	std::cout << "name: " << name << "  age:" << age;
	return;
}

2、從JSON檔案中解析Json

void ParseJsonFromFile()
{
	ifstream ifs;
	Json::Reader reader;
	Json::Value root;
	ifs.open("testReader.json", std::ios::binary);
	reader.parse(ifs, root, false);
	string schoolName = root["school"].asCString();
	std::cout << "school: " << schoolName << endl;
	int len = root["student"].size();
	Json::Value stu = root["student"];
	for(int i = 0; i < len; i++)
	{
		cout << "name: "<<stu[i]["name"].asCString() << endl;
		cout << "age: " << stu[i]["age"].asInt() << endl;
		cout << "nianji: " << stu[i]["nianji"].asCString() << endl;
		Json::Value book = root["student"][i]["books"];
		int size = book.size();
		for (int j = 0; j < size; j++)
		{
			cout << "shuming: " << book[j]["shuming"].asCString() << endl;
			cout << "author: " << book[j]["author"].asCString() << endl;
			cout << "price: " << book[j]["price"].asFloat() << endl;
		}
	}
	return;
}

3、向檔案中插入Json

void InsertJsonIntoFile()
{
	Json::FastWriter writer;
	Json::Reader reader;
	ifstream ifs;
	ofstream ofs;
	ifs.open("testReader.json", ios_base::binary);
	if (!ifs.is_open())
		return;
	Json::Value root;
	if (reader.parse(ifs, root, false))
	{
		Json::Value insertObj;
		Json::Value insertObj1;
		Json::Value arrayObj;
		insertObj["sex"] = "male";
		insertObj1["contry"] = "china";
		arrayObj.append(insertObj);
		arrayObj.append(insertObj1);
		for (int i = 0; i < root["student"].size(); i++)
		{
			root["student"][i]["sex"] = "male"; //直接在文字中插入一個欄位
			root["student"][i]["contry"]= "china";
			root["student"][i]["info"] = arrayObj;
		}

		string str = root.toStyledString();
		string strWrite = writer.write(root);
		ofs.open("testWroter.json");
		if (!ofs.is_open())
			return;
		ofs << strWrite;
		ofs.close();
	}	
	ifs.close();
}

測試程式碼:

#include <fstream>
#include <iostream>
#include "../dist/json/json.h"
#include "../dist/json/json-forwards.h"
#pragma comment(lib,"lib_json.lib")  
using namespace std;

void ParseJsonFromStr();
void ParseJsonFromFile();
void InsertJsonIntoFile();

int main()
 {

//	 ParseJsonFromStr();/*1、從字串解析json*/
//	 ParseJsonFromFile();//從檔案中解析json
	 InsertJsonIntoFile(); //想檔案中插入Json
	 return 1;
 }

void ParseJsonFromStr()
{
	const char* str = "{\"name\":\"xiaoming\",\"age\":18}";
	Json::Value root;
	Json::Reader reader;
	if (!reader.parse(str, root))
	{
		cout << "Parse from str failed\n";
		return;
	}
	
	string name = root["name"].asCString();
	int age = root["age"].asInt();
	std::cout << "name: " << name << "  age:" << age;
	return;
}

void ParseJsonFromFile()
{
	ifstream ifs;
	Json::Reader reader;
	Json::Value root;
	ifs.open("testReader.json", std::ios::binary);
	reader.parse(ifs, root, false);
	string schoolName = root["school"].asCString();
	std::cout << "school: " << schoolName << endl;
	int len = root["student"].size();
	Json::Value stu = root["student"];
	for(int i = 0; i < len; i++)
	{
		cout << "name: "<<stu[i]["name"].asCString() << endl;
		cout << "age: " << stu[i]["age"].asInt() << endl;
		cout << "nianji: " << stu[i]["nianji"].asCString() << endl;
		Json::Value book = root["student"][i]["books"];
		int size = book.size();
		for (int j = 0; j < size; j++)
		{
			cout << "shuming: " << book[j]["shuming"].asCString() << endl;
			cout << "author: " << book[j]["author"].asCString() << endl;
			cout << "price: " << book[j]["price"].asFloat() << endl;
		}
	}
	return;
}

void InsertJsonIntoFile()
{
	Json::FastWriter writer;
	Json::Reader reader;
	ifstream ifs;
	ofstream ofs;
	ifs.open("testReader.json", ios_base::binary);
	if (!ifs.is_open())
		return;
	Json::Value root;
	if (reader.parse(ifs, root, false))
	{
		Json::Value insertObj;
		Json::Value insertObj1;
		Json::Value arrayObj;
		insertObj["sex"] = "male";
		insertObj1["contry"] = "china";
		arrayObj.append(insertObj);
		arrayObj.append(insertObj1);
		for (int i = 0; i < root["student"].size(); i++)
		{
			root["student"][i]["sex"] = "male"; //直接在文字中插入一個欄位
			root["student"][i]["contry"]= "china";
			root["student"][i]["info"] = arrayObj;
		}

		string str = root.toStyledString();
		string strWrite = writer.write(root);
		ofs.open("testWroter.json");
		if (!ofs.is_open())
			return;
		ofs << strWrite;
		ofs.close();
	}	
	ifs.close();
}

與另外一種資料傳輸格式XML相比,JSON和XML各有優缺點,相對來說個人覺得XML的可讀性比較好,但用作資料傳輸的話JSON效率要高一點,因為JSON是純資料格式,而XML還用用於標記資料結束和開始的標籤頭等資訊,不同的場景應用不同,JSON在WEB方便應用較多,具體JSON和XML的區別可參考文件《JSON和XML的區別比較》

 Google最近開源了一種資料傳輸格式ProtoBuf,有興趣的朋友可以去學習比較下,本人也在持續學習中。

文章最後給出了JSON解析例子的的工程原始碼,以及測試過程中用到的JSON檔案,工程可以用VS2013以上的版本開啟。



相關推薦

JsonCpp使用Windows平臺

JSON:(JavaScript Object Notation)是基於Javascript的一種輕量級的資料交換格式,易於讀寫同時也易於機器解析和生成。具體詳細有關Json的資訊可參考JSON官網:http://www.json.org。 Json也是一種跨平臺多語音的資

安裝 PythonWindows 平臺

系統 target 成功 org win http 屬性 msi 軟件包 1、下載 python 軟件包 :https://www.python.org/ftp/python/2.7.13/python-2.7.13.amd64.msi 2、安裝 python :保持默認

MQTT服務器的搭建Windows平臺

prop res cti prope quest per 人工智能 alt 智能家居 人工智能、智能家居越來越火,在服務器和多個終端進行通信的過程中使用傳統的請求/回答(Request/Response)模式已經過時,伴隨而來的是發布/訂閱(Publish/Subscrib

執行多個TomcatWindows平臺

需求:在一臺計算機上,只安裝一份Tomcat發行版軟體,執行一個以上的Tomcat例項。 或者,因為計劃週期性地更新所安裝的Tomcat,不想把Web應用程式的檔案放入Tomcat發行版的目錄樹中。   解決方案: 《Tomcat權威指南》第2章重置Tomcat,重定向We

MQTT伺服器的搭建Windows平臺

人工智慧、智慧家居越來越火,在伺服器和多個終端進行通訊的過程中使用傳統的請求/回答(Request/Response)模式已經過時,伴隨而來的是釋出/訂閱(Publish/Subscribe)模式------MQTT(Message Queuing Telemetry Transport)協議。由於本文是講解

利用訊飛語音識別技術開發離線語音控制系統Windows平臺

本專案做出的產品是一個Windows下的增強現實系統,系統很龐大,產品功能已經基本完善,考慮到給使用者帶來更好的體驗,故綜合評估後採用訊飛語音識別方案進行嫁接。 專案介紹: 1)開啟系統時啟動語音識別,檢測到使用者說出關鍵詞(如:上一步,下一步,結束等)時,系統自動進行相應

SbS001——VMware Workstations 14 安裝與配置教程Windows平臺

一. 介紹VMware Workstation 是一款優秀的虛擬PC軟體,利用VMware工作站,可以在現有的作業系統上虛擬出一個或多個新的硬體環境,相當於模擬出多臺新的PC,以此來實現在一臺機器上同時執行多個獨立的作業系統。二. 下載或可自行網上搜索下載相應安裝包,這裡以官

MySQL的啟動方法windows 平臺

最近重新安裝了mysql資料庫,但是安裝時選擇的是手動啟動的,網上也看了一下別人的啟動方法但是不是很全,而且大部分是轉貼,經過自己的整理及操作,有以下幾種方法:3、啟動mysql,有如下方法: 最簡單的方法:方法一: 啟動服務安裝後在windows的服務選項中,選中mysql

Unity一鍵打包為APK檔案windows平臺

網上關於一鍵打包的資料多不勝數,這篇文章只是本人的一個歸納總結,希望能讓新人們少走點彎路。 前一篇文章介紹瞭如何在windows下用批處理呼叫Unity方法,看這篇文章前請先看一下它。 工作流程: 1. 從Unity匯出Android專案(批處理呼叫unity實現) 2.

C#接訊飛實現語音識別功能windows平臺

首先在訊飛官網下載語音識別的SDK,這些網上教程很多。(下載window平臺語音聽寫SDK) 1、建立一個C#工程 2、因為訊飛只有C/C++的介面,bi並沒有C#,需要將介面轉換為C#介面,自己先在工程中建立一個DLL類 在自己的dll中將C/C++的介面

Jmeter從下載到完成效能測試實戰教程Windows平臺

前言 本教程內容龐大,所以儘量寫的精簡,沒有寫出指令碼的具體編寫步驟,有興趣的朋友可以下載Demo後和教程對照著看。 請求的服務端,是通過服務端模擬器來生成的。可以下載Mock服務端模擬器,設定與教程相同的請求地址來學習。 Demo下載地址:點選下載 Moc

關於解決Python使用pip安裝pyjnius時的問題windows平臺

環境準備: 1、 安裝 python 2.7版本並配置環境變數 path中加入 Python27 Python27\Scripts 兩個路徑 2、執行命令(按順序執行)

Java開源知識庫:XWiki安裝Windows平臺

準備安裝XWiki,看了一下有三種安裝方式: XWiki is a Java-based wiki and runs on a Servlet Container such as Tomcat, Jetty, JBoss, WebLogic, WebSphere, et

Android基礎之用Eclipse搭建Android開發環境和建立第一個Android專案Windows平臺

一、搭建Android開發環境 準備工作:下載Eclipse、JDK、Android SDK、ADT外掛        1、安裝和配置JAVA開發環境:            ①把準備好的Eclipse和JDK安裝到本機上(最好安裝在全英文路徑下),並給JD

boost編譯windows平臺

boost中許多庫是無需編譯直接使用的,但也有需要編譯才能使用的庫。下面記錄一下編譯過程: 根據官方文件,只需要在boost庫的根目錄下執行以下命令即可編譯boost庫, bootstrap .\b2就是那麼簡單,漫長的編譯後,你就可以使用boost庫啦。 解析:首先第

kettle的下載、安裝和初步使用windows平臺圖文詳解

1.0 index java_home 網站 int 目錄 解決辦法 for sql kettle的下載   ?Kettle可以在http://kettle.pentaho.org/網站下載 http:

微服務架構Spring

SpringCloud元件和概念介紹 一:什麼是微服務(Microservice)  微服務英文名稱Microservice,Microservice架構模式就是將整個Web應用組織為一系列小的Web服務。這些小的Web服務可以獨立地編譯及部署,並通過各自暴露的API介面相互通訊。它們

單執行緒實現同時監聽多個埠windows平臺c++程式碼

前言   多年前開發了一套網路庫,底層實現採用IOCP(完成埠)。該庫已在公司多個程式中應用;經過多次修改,長時間檢驗,已經非常穩定高效。 最近把以前的程式碼梳理了一下,又加進了一些新的思路。程式碼結構更加合理,效能也有所提升。打算將該庫一些的知識點寫出來,以供參考。 服務端要在多個埠監聽,這種場合並不多見。

使用SwitchHosts快速切換hostsWindows平臺快速切換hosts

場景:平時的開發中經常涉及到環境(域名-IP)的切換,生產環境、測試環境等時不時都要切換域名對應的IP,總不可能每次都去 C:\Windows\System32\drivers\etc 修改hosts檔案吧。。這樣是很麻煩的,所以使用SwitchHosts這個軟體來切換域名和

Qt GUI 通過滑鼠事件剖析整個事件處理流程基於Qt4.5.2原始碼windows平臺

/*以下分析的是Windows平臺 Qt GUI程式的事件產生,分發,處理全過程(基於Qt5.4.2原始碼整理) 以一個滑鼠按壓的事件為例子講述 ...表示省略掉一些程式碼(skip code) 事件起源: 基於事件如何被產生與分發,可以把事件分為以下三類。 Spon