1. 程式人生 > 程式設計 >C++使用jsoncpp解析json的方法示例

C++使用jsoncpp解析json的方法示例

前言:

曾經一段時間XML成為網際網路業界內的資料傳輸格式標準,但有人對XML提出了質疑,認為XML資料格式比較繁雜,冗長等,於是提出了一種新的表示格式—JSON。

對於JSON格式,在此就不作詳細的說明了,下面主要討論下C++解析json檔案的工具—Jsoncpp的使用。

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,和xml類似,本文主要對VS2008中使用Jsoncpp解析json的方法做一下記錄。
Jsoncpp是個跨平臺的開源庫,下載地址:http://sourceforge.net/projects/jsoncpp/。

解壓:tar -zvxf jsoncpp-src-0.5.0.tar.gz

進入到jsoncpp解壓目錄下,執行命令:

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使用說明:

下面通過一個簡單的case說明jsoncpp裡主要的介面函式,通過這些基本的函式便可以完成的Json檔案的解析和處理。

jsoncpp中主要的類:


  • Json::Value:可以表示所有支援的型別,如:int,double,string,object,array等。其包含節點的型別判斷(isNull,isBool,isInt,isArray,isMember,isValidIndex等),型別獲取(type),型別轉換(asInt,asString等),節點獲取(get,[]),節點比較(過載<,<=,>,>=,==,!=),節點操作(compare,swap,removeMember,removeindex,append等)等函式。
  • Json::Reader:將檔案流或字串創解析到Json::Value中,主要使用parse函式。Json::Reader的建構函式還允許使用者使用特性Features來自定義Json的嚴格等級。
  • Json::Writer:與JsonReader相反,將Json::Value轉換成字串流等,Writer類是一個純虛類,並不能直接使用。在此我們使用 Json::Writer 的子類:Json::FastWriter(將資料寫入一行,沒有格式),Json::StyledWriter(按json格式化輸出,易於閱讀)。
  • Json::Reader可以通過對Json源目標進行解析,得到一個解析好了的Json::Value,通常字串或者檔案輸入流可以作為源目標。

json示例:

[
 { "name": "json","lines": 
   [
    { "line": "1" },{ "line": "2" },{ "cpp": "jsoncpp" },{ "java": "jsoninjava" },{ "php": "support" }
   ]
 },{ "name": "c++","lines": 
   [
    { "line": "3" },{ "line": "4" },{ "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的值值可以是任一物件
  
  if (reader.parse(strjson,root)) {
  
    int size = root.size();   // 根結點個數
  
    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;
      }
    }
  }
 
}

到此這篇關於C++使用jsoncpp解析json的方法示例的文章就介紹到這了,更多相關C++ jsoncpp解析json內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!