JSONCPP介紹及使用
一、JSON簡介
JSON全稱為JavaScript ObjectNotation,它是一種輕量級的數據交換格式,易于閱讀、編寫、解析。
JSON由兩種基本結構構成:
1)"名稱/值"對的集合,可以理解為對象。
2)值的組合,可以理解為數組。
JSON對象簡單示例
示例1:
{
"header": {
"pid": "10",
"cas": "1"
},
"body": {
"bodyCode": "JSON",
"bodyName":"JavaScriptObject Notation",
"GUId": "1"
}
}
示例2:
{
"header": {
"pid": "10",
"cas": "1"
},
"ack": [{
"ackCode": "JSON",
"ackName":"JavaScript ObjectNotation",
},{
"ackCode": "JSON",
"ackName":"JavaScript ObjectNotation",
}
"GUId":"1"
}
JSON更詳細的介紹請看官網:http://www.json.org
二、JSONCPP
1. JsonCPP簡介
jsoncpp是c++解析JSON串常用的解析庫之一。其常用的類有:
a) Json::Value 可以表示里所有的類型,比如int,string,object,array等,其支持的類型可以參考Json:ValueType中的值。
b) Json::Reader 將json文件流或字符串解析到Json::Value,主要函數有Parse。
c) Json::Writer 與Json::Reader相反,將Json::Value轉化成字符串流,注意它的兩個子類:Json::FastWriter和Json::StyleWriter,分別輸出不帶格式的json和帶格式的json。
d) Json::Value::Members主要用于以STL風格解析JSON數組。看過源代碼的人已知道,Members其實是typedefvector
2. JSONCPP解析示例
a) 解析JSON串格式
{
"JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207",
"Send" : {
"ID" : "B8E09E97-F379-4bb0-814A-389FD3F66631",
"Items" : [
{
"Count" : 2,
"Code" : "0101",
"X" : 1,
"Y" : 2
},
{
"Count" : 2,
"Code" : "0101",
"X" : 1,
"Y" : 2
}
]
}
}
b) 生成的JSON串
{
"Ack" : [
{
"ActualCount" : 2,
"Code" : "0101"
},
{
"ActualCount" : 2,
"Code" : "0101"
}
],
"JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207"
}
c) 解析、生成JSON代碼
需要引入的.h文件
#pragma once #pragma comment(lib, "json_vc71_libmtd.lib") #include "json/json.h"
實現
void CJSONTestDlg::OnBnClickedButton1() { CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT1); CString str; pEdit->GetWindowText(str); //str即為a)中定義的JSON串 pEdit->FmtLines(true); Json::Reader reader; Json::Value root; if (reader.parse(WC2UT(str.GetBuffer(0)), root)) // reader將Json字符串解析到root,root將包含Json里所有子元素 { std::string JsonID = root["JsonID"].asString(); Json::Value rtnRoot; rtnRoot["JsonID"]=JsonID; Json::Value ack; Json::Value send = root["Send"]; if(!send["Items"].isNull()){ Json::Value Items = send["Items"]; int sendSize = Items.size(); for(int i=0;iSetWindowText(result); }else{ CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2); pRtnEdit->SetWindowText(_T("JSON格式錯誤")); } }
將JSONCPP以靜態庫方式導入,需要注意項目中的代碼生成中的運行庫,和JSONCPP的靜態庫項目的代碼生成的運行庫要一致,否則將報如下錯誤
afxver_.h(81): fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
項目中的Runtime Library需設置的一樣
來自:http://blog.csdn.net/fengshuiyue/article/details/8724204