1.     JsonCPP简介

      jsoncpp是c++解析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::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。

d)     Json::Value::Members 主要用于以STL风格解析JSON数组。看过源代码的人已知道,Members其实是typedefvector<string>而已。

2.     JSONCPP解析示例

解析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
             }
         ]
     }
 }生成的JSON串
{
     "Ack": [
         {
             "ActualCount": 2,
             "Code": "0101"
         },
         {
             "ActualCount": 2,
             "Code": "0101"
         }
     ],
     "JsonID": "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207"
 }

c)        解析、生成JSON代码

需要引入的.h文件



1. #pragma once  
2. #pragma comment(lib, "json_vc71_libmtd.lib")  
3.    
4. #include "json/json.h"

实现

1. void CJSONTestDlg::OnBnClickedButton1()  
2. {  
3.     CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT1);  
4.     CString str;   
5. //str即为a)中定义的JSON串  
6. 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. "JsonID"].asString();   
14.         Json::Value rtnRoot;  
15. "JsonID"]=JsonID;  
16.   
17.         Json::Value ack;  
18. "Send"];  
19. if(!send["Items"].isNull()){  
20. "Items"];  
21. int sendSize = Items.size();  
22.   
23. for(int i=0;i<sendSize;i++){//循环获取到JSON串数组当中的值  
24. "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. "Code"]=Code;  
32. "ActualCount"]=count;  
33.   
34.                 ack.append(newAckItem);  
35.             }  
36.         }  
37. "Ack"]=ack;  
38. //生成带格式的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. "根据JSON串,生成的对应JSON串信息"));  
46.         CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
47.         pEdit->SetWindowText(result);    
48. else{  
49.         CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
50. "JSON格式错误"));    
51.     }  
52. }


 

运行库要一致,否则将报如下错误

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

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


Json解析数组实例_Code