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也是一種跨平臺多語音的資
安裝 Python(Windows 平臺)
系統 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
執行多個Tomcat(Windows平臺)
需求:在一臺計算機上,只安裝一份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快速切換hosts(Windows平臺快速切換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