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需设置的一样