C++使用jsoncpp解析json的方法示例
前言:
曾經(jīng)一段時(shí)間XML成為互聯(lián)網(wǎng)業(yè)界內(nèi)的數(shù)據(jù)傳輸格式標(biāo)準(zhǔn),但有人對(duì)XML提出了質(zhì)疑,認(rèn)為XML數(shù)據(jù)格式比較繁雜,冗長(zhǎng)等,于是提出了一種新的表示格式—JSON。
對(duì)于JSON格式,在此就不作詳細(xì)的說(shuō)明了,下面主要討論下C++解析json文件的工具—Jsoncpp的使用。
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,和xml類(lèi)似,本文主要對(duì)VS2008中使用Jsoncpp解析json的方法做一下記錄。
Jsoncpp是個(gè)跨平臺(tái)的開(kāi)源庫(kù),下載地址:http://sourceforge.net/projects/jsoncpp/。
解壓:tar -zvxf jsoncpp-src-0.5.0.tar.gz
進(jìn)入到j(luò)soncpp解壓目錄下,執(zhí)行命令:
sudo scons platform=linux-gcc
將/jsoncpp-src-0.5.0/include/目錄下的json文件夾拷貝到 /usr/local/include/
將jsoncpp-src-0.5.0/libs/linux-gcc-4.9.1/目錄下的libjson_linux-gcc-4.9.1_libmt.a 拷貝到 /usr/local/lib/ 下,并為了方便使用,將其重命名為libjson.a
Jsoncpp使用說(shuō)明:
下面通過(guò)一個(gè)簡(jiǎn)單的case說(shuō)明jsoncpp里主要的接口函數(shù),通過(guò)這些基本的函數(shù)便可以完成的Json文件的解析和處理。
jsoncpp中主要的類(lèi):
- Json::Value:可以表示所有支持的類(lèi)型,如:int , double ,string , object, array等。其包含節(jié)點(diǎn)的類(lèi)型判斷(isNull,isBool,isInt,isArray,isMember,isValidIndex等),類(lèi)型獲取(type),類(lèi)型轉(zhuǎn)換(asInt,asString等),節(jié)點(diǎn)獲取(get,[]),節(jié)點(diǎn)比較(重載<,<=,>,>=,==,!=),節(jié)點(diǎn)操作(compare,swap,removeMember,removeindex,append等)等函數(shù)。
- Json::Reader:將文件流或字符串創(chuàng)解析到Json::Value中,主要使用parse函數(shù)。Json::Reader的構(gòu)造函數(shù)還允許用戶(hù)使用特性Features來(lái)自定義Json的嚴(yán)格等級(jí)。
- Json::Writer:與JsonReader相反,將Json::Value轉(zhuǎn)換成字符串流等,Writer類(lèi)是一個(gè)純虛類(lèi),并不能直接使用。在此我們使用 Json::Writer 的子類(lèi):Json::FastWriter(將數(shù)據(jù)寫(xiě)入一行,沒(méi)有格式),Json::StyledWriter(按json格式化輸出,易于閱讀)。
- Json::Reader可以通過(guò)對(duì)Json源目標(biāo)進(jìn)行解析,得到一個(gè)解析好了的Json::Value,通常字符串或者文件輸入流可以作為源目標(biāo)。
json示例:
[
{ "name": "json",
"lines":
[
{ "line": "1" },
{ "line": "2" },
{ "cpp": "jsoncpp" },
{ "java": "jsoninjava" },
{ "php": "support" }
]
},
{ "name": "c++",
"lines":
[
{ "line": "3" },
{ "line": "4" },
{ "cpp": "jsoncpp" },
{ "java": "jsoninjava" },
{ "php": "nosupport" }
]
}
]
C++代碼:
#include <iostream>
#include <fstream>
#include <string>
#include "../src/json/json.h"
using namespace std;
using namespace Json;
void main()
{
fstream ofile("json.json");
string strjson;
if (!ofile.is_open()) {
return;
}
string strline;
while (getline(ofile, strline)) {
strjson += strline;
}
ofile.close();
Json::Reader reader; // 讀取器
Json::Value root; // Value的值值可以是任一對(duì)象
if (reader.parse(strjson, root)) {
int size = root.size(); // 根結(jié)點(diǎn)個(gè)數(shù)
for (int j = 0; j < size; j++) {
cout << root[j]["name"].asString() << endl;
const Json::Value arrayObj = root[j]["lines"];
for (int i = 0; i < arrayObj.size(); i++) {
if (arrayObj[i].isMember("line")) {
cout << arrayObj[i]["line"].asString() << endl;
}
if (arrayObj[i].isMember("cpp")) {
cout << arrayObj[i]["cpp"].asString() << endl;
}
if (arrayObj[i].isMember("java")) {
cout << arrayObj[i]["java"].asString() << endl;
}
int m = 0;
}
}
}
}
到此這篇關(guān)于C++使用jsoncpp解析json的方法示例的文章就介紹到這了,更多相關(guān)C++ jsoncpp解析json內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OPENMP?SECTIONS?CONSTRUCT原理示例解析
這篇文章主要為大家介紹了OPENMP?SECTIONS?CONSTRUCT原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
C語(yǔ)言實(shí)現(xiàn)五子棋人人對(duì)戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)五子棋人人對(duì)戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
windows下在vim中搭建c語(yǔ)言開(kāi)發(fā)環(huán)境的詳細(xì)過(guò)程
這篇文章主要介紹了windows下在vim中搭建c語(yǔ)言開(kāi)發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
C++基于socket UDP網(wǎng)絡(luò)編程實(shí)現(xiàn)簡(jiǎn)單聊天室功能
這篇文章主要為大家詳細(xì)介紹了C++基于socket UDP網(wǎng)絡(luò)編程實(shí)現(xiàn)簡(jiǎn)單聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Qt自定義控件實(shí)現(xiàn)線(xiàn)條型加載條
這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)線(xiàn)條型加載條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C語(yǔ)言實(shí)現(xiàn)數(shù)組的循環(huán)移位的方法示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)數(shù)組的循環(huán)移位的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
C++多字節(jié)字符與寬字節(jié)字符相互轉(zhuǎn)換
最近在C++編程中經(jīng)常遇到需要多字節(jié)字符與寬字節(jié)字符相互轉(zhuǎn)換的問(wèn)題,自己寫(xiě)了一個(gè)類(lèi)來(lái)封裝wchar_t與char類(lèi)型間的轉(zhuǎn)換2012-11-11

