Json解析數組實例

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而已。

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. #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. Json::Reader reader;

    8. Json::Value root;

    9. if (reader.parse(WC2UT(str.GetBuffer(0)), root)) // reader將Json字符串解析到root,root將包含Json裡所有子元素

    10. {

    11. std::string JsonID = root[“JsonID”].asString();

    12. Json::Value rtnRoot;

    13. rtnRoot[“JsonID”]=JsonID;

    14. Json::Value ack;

    15. Json::Value send = root[“Send”];

    16. if(!send[“Items”].isNull()){

    17. Json::Value Items = send[“Items”];

    18. int sendSize = Items.size();

    19. for(int i=0;i<sendSize;i++){//循環獲取到JSON串數組當中的值

    20. std::string Code = Items[i][“Code”].asString();

    21. int x = Items[i][“X”].asInt();

    22. int y = Items[i][“Y”].asInt();

    23. int count = Items[i][“Count”].asInt();

    24. //更具讀到的JSON串中的值生成所需內容

    25. Json::Value newAckItem;

    26. newAckItem[“Code”]=Code;

    27. newAckItem[“ActualCount”]=count;

    28. ack.append(newAckItem);

    29. }

    30. }

    31. rtnRoot[“Ack”]=ack;

    32. std::string rtnOut = rtnRoot.toStyledString();//生成帶格式的JSON串

    33. #ifdef UNICODE

    34. std::wstring stemp = s2ws(rtnOut);

    35. LPCWSTR result = stemp.c_str();

    36. #else

    37. LPCWSTR result = rtnOut.c_str();

    38. #endif

    39. MessageBox(result,_T(“根據JSON串,生成的對應JSON串信息”));

    40. CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);

    41. pEdit->SetWindowText(result);

    42. }else{

    43. CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);

    44. pRtnEdit->SetWindowText(_T(“JSON格式錯誤”));

    45. }

    46. }

      將JSONCPP以靜態庫方式導入,需要註意項目中的代碼生成中的運行庫,和JSONCPP的靜態庫項目的代碼生成的運行庫要一致,否則將報如下錯誤

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

      項目中的Runtime Library需設置的一樣

發佈留言