在C++中利用JsonCPP解析JSON

jopen 11年前發布 | 82K 次閱讀 JSON開發包 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簡介

      jsoncppc++解析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::FastWriterJson::StyleWriter,分別輸出不帶格式的json和帶格式的json

d)     Json::Value::Members 主要用于以STL風格解析JSON數組。看過源代碼的人已知道,Members其實是typedefvector<string>而已。

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;i<sendSize;i++){//循環獲取到JSON串數組當中的值  
                    std::string  Code = Items[i]["Code"].asString();  
                    int x = Items[i]["X"].asInt();  
                    int y = Items[i]["Y"].asInt();  
                    int count = Items[i]["Count"].asInt();  

                    //更具讀到的JSON串中的值生成所需內容  
                    Json::Value newAckItem;  
                    newAckItem["Code"]=Code;  
                    newAckItem["ActualCount"]=count;  

                    ack.append(newAckItem);  
                }  
            }  
            rtnRoot["Ack"]=ack;  
            std::string rtnOut = rtnRoot.toStyledString();//生成帶格式的JSON串  
    #ifdef UNICODE  
            std::wstring stemp = s2ws(rtnOut);   
            LPCWSTR result = stemp.c_str();  
    #else  
            LPCWSTR result = rtnOut.c_str();  
    #endif  
            MessageBox(result,_T("根據JSON串,生成的對應JSON串信息"));  
            CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
            pEdit->SetWindowText(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需設置的一樣1364310441_4588.png

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!