C++ 配置生成与解析Json
参考地址1
遇到编译未通过,有个配置属性的 地址
解压后用vs打开makefiles文件夹,里面是jsoncpp和两个test的工程,jsoncpp如下红框中。
编译jsoncpp项目,然后在程序目录的build文件夹下可以找到编译好的lib文件debug和release下的文件名不同,debug下是json_vc71_libmtd.lib,release下是json_vc71_libmt.lib。
想要在我们的项目中加入jsoncpp库也很简单,只要把jsoncpp的项目的.h文件和.lib文件加入到我们的项目中就可以了,注意引用目录,然后编译看看有没有错误。
-------------------------------------如果出现编译错误,请看这里,否则跳过虚线内容------------------------------------------
1.更改项目属性的运行库
2.Debug模式下编译,应该是没有错误的,如果出现链接错误或者是找不到文件,请查看文件路径设置对不对。需要注意的是Release模式下编译,
有可能会出现fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_writer.asm”: No such file or directory ,
我也出现了这个错误。后来在网上查找原因,好像是jsoncpp的项目编译设置的问题。需要在jsoncpp的项目设置中做如下修改:
----------------------------------------------------------------------------------------------------------------------------
如下图为json解析过程。
const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}"; Json::Reader reader; Json::Value root; if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素 { std::string upload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000" int code = root["code"].asInt(); // 访问节点,code = 100 }
void readJson() { using namespace std; std::string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}"; Json::Reader reader; Json::Value value; if (reader.parse(strValue, value)) { std::string out = value["name"].asString(); std::cout << out << std::endl; const Json::Value arrayObj = value["array"]; for (unsigned int i = 0; i < arrayObj.size(); i++) { if (!arrayObj[i].isMember("cpp")) continue; out = arrayObj[i]["cpp"].asString(); std::cout << out; if (i != (arrayObj.size() - 1)) std::cout << std::endl; } } }
#include "json.h"
如下为序列化写Json对象
//假设有一个json对象如下:
{ "name": "json″, "array": [ { "cpp": "jsoncpp" }, { "java": "jsoninjava" }, { "php": "support" } ] }
void writeJson() { using namespace std; Json::Value root; Json::Value arrayObj; Json::Value item; item["cpp"] = "jsoncpp"; item["java"] = "jsoninjava"; item["php"] = "support"; arrayObj.append(item); root["name"] = "json"; root["array"] = arrayObj; root.toStyledString(); std::string out = root.toStyledString(); std::cout << out << std::endl; }
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" }
解析、生成JSON代码 需要引入的.h文件 [html] view plaincopy #pragma once #pragma comment(lib, "json_vc71_libmtd.lib") #include "json/json.h" 实现 [cpp] view plaincopy 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(); // JsonID取root元素下的值 Json::Value rtnRoot; rtnRoot["JsonID"]=JsonID; Json::Value ack; Json::Value send = root["Send"]; //send取root下的Send值 if(!send["Items"].isNull()){ Json::Value Items = send["Items"]; //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格式错误")); } }