JSONCPP介绍及使用
一、JSON简介 JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。 JSON由两种基本结构构成: 1)"名称/值对的集合,可以理解为对象。 2)值的组合,可以理解为数组。 对象简单示例 示例: { "header": { "pid": "10", "cas": "1" }, "body": { "bodyCode": "JSON", "bodyName":"JavaScriptObject Notation", "GUId": "1" } } : { "header": { "pid": "10", "ack": [{ "ackCode": "JSON", "ackName":"JavaScript ObjectNotation", },{ "ackCode": "JSON", } "GUId":"1" } JSON更详细的介绍请看官网:http://www.json.org 二、JSONCPP 1. JsonCPP简介 jsoncpp是c++解析串常用的解析库之一。其常用的类有: 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,分别输出不带格式的和带格式的。 d) Json::Value::Members 主要用于以STL风格解析数组。看过源代码的人已知道,Members其实是typedefvector<string>而已。 2. JSONCPP解析示例 a)串格式 { "JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207", "Send" : { "ID" : "B8E09E97-F379-4bb0-814A-389FD3F66631", "Items" : [ { "Count" : 2, "Code" : "0101", "X" : 1, "Y" : 2 }, { "Count" : 2, "Y" : 2 } ] } } b)生成的串 { "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需设置的一样 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |