使用C++處理JSON數據交換格式,附已經VC2005編譯好的靜態lib庫

地址: http://blog.csdn.net/hujkay
作者:Jekkay Hu([email protected])
關鍵詞:C++, Json, Json解析靜態庫
時間: 2014/3/21

使用C++處理JSON數據交換格式
部分文章引用鏈接:http://blog.csdn.net/nana08/article/details/6918877

1. 摘要

    JSON的全稱爲:JavaScript Object Notation,顧名思義,JSON是用於標記Javascript對象的,JSON官方的解釋爲:JSON是一種輕量級的數據傳輸格式。本文並不詳細介紹JSON本身的細節,旨在討論如何使用C++語言來處理JSON。關於JSON更具體的信息,可參見JSON官網:http://www.json.orghttp://json.org/json-zh.html

2. 選擇處理JSON的C++庫

   本文選擇一個第三方庫jsoncpp來解析JSON,該庫也在JSON官網也是機理推薦的。
   下載地址爲:http://sourceforge.net/projects/jsoncpp

3. jsoncpp在Windows下的編譯

要使用第三方源碼庫,第一步少不了的就是編譯,將源碼文件編譯成我們方便使用的動態鏈接庫、靜態鏈接庫或者靜態導入庫[1]。
jsconcpp進行JSON解析的源碼文件分佈在include/json、src/lib_json下。其實jsoncpp源碼並不多,爲了方便產品管理,此處沒必要將其編譯爲動態鏈接庫或者靜態導入庫,所以我們選擇使用靜態鏈接庫[2]。
jsoncpp已經處理的很完善了,所有編譯選項都已經配置好,打開makefiles/vs71/jsoncpp.sln便可以開始編譯(默認是使用VS2003編譯器的,打開時直接按照VS2005提示轉換即可)。
   如果使用編譯好的jsoncpp靜態庫發生如下錯誤:
gathermac.cpp
Compiling resources...
Linking...
Generating code
c:\resource\vccode\qiyi\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json\json_reader.cpp : fatal error C1083: Cannot open compiler generated file: '../../build/vs71/release/lib_json\json_reader.asm': No such file or directory
LINK : fatal error LNK1257: code generation failed
Build log was saved at "file://c:\resource\vccode\qiyi\gathermac\gathermac\Release\BuildLog.htm"
gathermac - 2 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

那麼請jsoncpp的工程屬性修改一下:C/C++ -> Output Files -> Assembler Output 修改爲 No Listing.,然後重新編譯即可。

4. jsoncpp使用詳解 

    jsoncpp庫中常用的類有三種:Value、Reader、Writer。jsoncpp中所有對象、類名都在名空間Json中。在實際
項目使用中,只需要包含json.h即可。Json::Value只能處理ANSI類型的字符串,如果C++程序是用Unicode編碼的,最好加一個Adapt類來適配。 

4.1 Json::Value 

    Json::Value是jsoncpp中最基本、最重要的類,用於表示各種類型的對象,jsoncpp支持的對象類型可見Json::ValueType枚舉值。
可如下是用Json::Value類:
Json::Value json_temp;      //臨時對象,供如下代碼使用
json_temp["name"] = Json::Value("huchao");
json_temp["age"] = Json::Value(26);
Json::Value root;  //表示整個json對象
root["key_string"] = Json::Value("value_string");         //新建一個Key(名爲:key_string),賦予字符串值:"value_string"。 
root["key_number"] = Json::Value(12345);            //新建一個Key(名爲:key_number),賦予數值:12345。 
root["key_boolean"] = Json::Value(false);              //新建一個Key(名爲:key_boolean),賦予bool值:false。
root["key_double"] = Json::Value(12.345);            //新建一個Key(名爲:key_double),賦予double值:12.345。
root["key_object"] = Json_temp;                           //新建一個Key(名爲:key_object),賦予json::Value對象值。
root["key_array"].append("array_string");             //新建一個Key(名爲:key_array),類型爲數組,對第一個元素賦值爲字符串:"array_string"。
root["key_array"].append(1234);                           //爲數組key_array賦值,對第二個元素賦值爲:1234。
Json::ValueType type = root.type();                       //獲得root的類型,此處爲objectValue類型。

注:跟C++不同,JavaScript數組可以爲任意類型的值,所以jsoncpp也可以。
   如上幾個用法已經可以滿足絕大部分json應用了,當然jsoncpp還有一些其他同能,比如說設置註釋、比較json大小、交換json對象等,都很容易使用,大家自己嘗試吧。

4.2 Json::Writer

  如上說了Json::Value的使用方式,現在到了該查看剛纔賦值內容的時候了,查看json內容,使用Writer類即可。
Jsoncpp的Json::Writer類是一個純虛類,並不能直接使用。在此我們使用Json::Writer的子類:Json::FastWriter、Json::StyledWriter和Json::StyledStreamWriter。
顧名思義,用Json::FastWriter來處理json應該是最快的,下面我們來試試。
Json::FastWriter fast_writer;
std::cout << fast_writer.write(root) << std::endl;

輸出結果爲:
{"key_array":["array_string",1234],"key_boolean":false,"key_double":12.3450,"key_number":12345,"key_object":{"age":26,"name":"huchao"},"key_string":"value_string"}

再次顧名思義,用Json::StyledWriter是格式化後的json,下面我們來看看Json::StyledWriter是怎樣格式化的。
Json::StyledWriter styled_writer;
std::cout << styled_writer.write(root) << std::endl;
輸出結果爲:
{"key_array" : [ "array_string", 1234 ], "key_boolean" : false,"key_double" : 12.3450, "key_number" : 12345, "key_object" : { "age" : 26,  "name" : "huchao"}, "key_string" : "value_string" }

4.3 Json::Reader

    Json::Reader是用於讀取的,說的確切點,是用於將字符串轉換爲Json::Value對象的,下面我們來看個簡單的例子。
  
Json::Reader reader;
json::Value json_object;
const char* json_document = "{\"age\" : 26,\"name\" : \"huchao\"}";
if (!reader.parse(json_document, json_object))
    return 0;
std::cout << json_object["name"] << std::endl;
std::cout << json_object["age"] << std::endl;

輸出結果爲:
"huchao" 
26

5. 總結

    我們可以看到,使用jsoncpp庫可以輕鬆地解析json格式字符串。爲了方便大家使用該庫,我自己在XP+VC2005上重新編譯了一下,大家可以直接使用該庫。比如,在VC項目中,只需要將下列代碼放入stdafx.h末尾,然後再把其頭文件所在目錄包含進來即可。
// 添加json解析庫
#include "json/json.h"
#ifdef _DEBUG
#pragma comment(lib,"../lib/json_vc_libmtd.lib")
#else
#pragma comment(lib,"../lib/json_vc_libmt.lib")
#endif

 已編譯好的jsoncpp-src-0.5.0 靜態lib庫的下載地址爲:
   下載地址: http://download.csdn.net/detail/hujkay/7078631
   

胡楊, Jekkay Hu

2014/3/21


發佈了52 篇原創文章 · 獲贊 16 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章