首页 > 代码库 > Json解析数组实例

Json解析数组实例

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文件

[html] view plaincopy
  1. #pragma once  
  2. #pragma comment(lib, "json_vc71_libmtd.lib")  
  3.    
  4. #include "json/json.h"  

实现

[cpp] view plaincopy
  1. void CJSONTestDlg::OnBnClickedButton1()  
  2. {  
  3.     CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT1);  
  4.     CString str;   
  5.     pEdit->GetWindowText(str); //str即为a)中定义的JSON串  
  6.     pEdit->FmtLines(true);  
  7.   
  8.     Json::Reader reader;  
  9.     Json::Value root;  
  10.   
  11.     if (reader.parse(WC2UT(str.GetBuffer(0)), root))  // reader将Json字符串解析到root,root将包含Json里所有子元素  
  12.     {  
  13.         std::string JsonID = root["JsonID"].asString();   
  14.         Json::Value rtnRoot;  
  15.         rtnRoot["JsonID"]=JsonID;  
  16.   
  17.         Json::Value ack;  
  18.         Json::Value send = root["Send"];  
  19.         if(!send["Items"].isNull()){  
  20.             Json::Value Items = send["Items"];  
  21.             int sendSize = Items.size();  
  22.   
  23.             for(int i=0;i<sendSize;i++){//循环获取到JSON串数组当中的值  
  24.                 std::string  Code = Items[i]["Code"].asString();  
  25.                 int x = Items[i]["X"].asInt();  
  26.                 int y = Items[i]["Y"].asInt();  
  27.                 int count = Items[i]["Count"].asInt();  
  28.                   
  29.                 //更具读到的JSON串中的值生成所需内容  
  30.                 Json::Value newAckItem;  
  31.                 newAckItem["Code"]=Code;  
  32.                 newAckItem["ActualCount"]=count;  
  33.   
  34.                 ack.append(newAckItem);  
  35.             }  
  36.         }  
  37.         rtnRoot["Ack"]=ack;  
  38.         std::string rtnOut = rtnRoot.toStyledString();//生成带格式的JSON串  
  39. #ifdef UNICODE  
  40.         std::wstring stemp = s2ws(rtnOut);   
  41.         LPCWSTR result = stemp.c_str();  
  42. #else  
  43.         LPCWSTR result = rtnOut.c_str();  
  44. #endif  
  45.         MessageBox(result,_T("根据JSON串,生成的对应JSON串信息"));  
  46.         CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
  47.         pEdit->SetWindowText(result);    
  48.     }else{  
  49.         CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
  50.         pRtnEdit->SetWindowText(_T("JSON格式错误"));    
  51.     }  
  52. }  

 

将JSONCPP以静态库方式导入,需要注意项目中的代码生成中的运行库,和JSONCPP的静态库项目的代码生成的运行库要一致,否则将报如下错误

afxver_.h(81): fatal error C1189: #error :  Please use the /MD switch for _AFXDLL builds

项目中的Runtime Library需设置的一样

Json解析数组实例