(中行雷威2018.6.1)
(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)
【阅读倡议】
1、有问题请留言;
2、没问题请点赞;
3、看连载请加群;
4、下源码请加群;
【开发工具】
1、C++Builder10.2.2tokyo
2、FMSoft_uniGUI_Complete_Professional_1.10.0build1462(正版)
今天是六一儿童节,醒的早了点,无聊至极,把前段时间关于JSON解析的研究成果分享大家。本例子将详细教授如何调用jsoncpp库文件实现JSON报文的解析,虽在uniGUI下实现,但是同样适用于一般VCL项目。JSONCPP库文件和本教程的源代码清到我的QQ群共享文件A02-源代码里下载。
一、新建项目
1、新建项目主目录d:\testJson,将jsoncpp库文件(json\include+json\lib)拷贝到项目主目录下.
d:\testJson
--json
--include
--lib
2、新建uniGUI项目,主目录设置为d:\testJson
3、添加json头文件和库文件目录
主菜单project-》options,在IncludePath和Library Path分别添加D:\testJson\json\include和D:\testJson\json\lib两个目录。
4、设置编译选项
这两个编译选项是uniGUI项目必须设置的,我总是担心小白鼠们不知道,后续教程不在单独解释了哈。
二、代码实现
如下图所示,在Main.cpp对应的MainForm窗口上布局两个UniMemo和两个UniBitBtn空间,第一个按钮打包一个JSON报文到UniMemo1里显示,第二个按钮解包JSON数据项到UniMemo2里显示。
1、jsoncpp库文件引用代码
Main.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop
/*自定义*/
#include "json\\include\\reader.h"
#include "json\\include\\writer.h"
#include "json\\include\\value.h"
#include "Main.h"
#include "MainModule.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
/*json自定义*/
#if defined (__clang__)
#pragma link "jsoncpp.a"
#else
#pragma link "jsoncpp.lib"
#endif
/**/
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma link "uniMemo"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TMainForm *MainForm(void)
{
return( (TMainForm *)UniMainModule()->GetFormInstance(__classid(TMainForm)));
}
2、打包按钮
void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
//打包json
AnsiString tmpStr,sendMsg;
Json::Reader jsonReader;//json解析器
Json::Value jsonSendMsg;//json报文
Json::Value jsonItem;//json数组成员
Json::Value jsonArray;//json数组
jsonSendMsg.clear();
jsonArray.clear();
jsonSendMsg["partNo"]="PART001";//添加一个普通数据项:部门编号
jsonSendMsg["partName"]="开发一部";//添加一个普通数据项:部门名称
for(int i=1;i<=10;i++)
{
tmpStr="员工号:"+String(i);//构造数组成员员工号的值
jsonItem["userNo"]=tmpStr.c_str();//添加userNo员工号成员
tmpStr="员工姓名:"+String(i+8000);//构造数组成员员工姓名的值
jsonItem["userName"]=tmpStr.c_str();//添加userName员工姓名成员
jsonArray.append(jsonItem);//添加数组成员
}
jsonSendMsg["userArray"]=jsonArray;//添加数组userArray进json报文
sendMsg=jsonSendMsg.toStyledString().c_str();
UniMemo1->Lines->Clear();
UniMemo1->Lines->Add(sendMsg);
}
3、解包按钮
void __fastcall TMainForm::UniBitBtn2Click(TObject *Sender)
{
//解包
AnsiString recvMsg,tmpStr;
Json::Reader jsonReader;//json解析器
Json::Value jsonRecvMsg;//json报文
Json::Value jsonItem;//json数组成员
Json::Value jsonArray;//json数组
recvMsg=UniMemo1->Text;
if(!jsonReader.parse(recvMsg.c_str(),jsonRecvMsg)) //解析判断JSON报文是否正常{
ShowMessage("解析失败:JSON报文格式错误!");
return;
}
UniMemo2->Clear();
tmpStr=jsonRecvMsg["partNo"].asCString();//解析partNo数据项
UniMemo2->Lines->Add(tmpStr);
tmpStr=jsonRecvMsg["partName"].asCString();//解析partName数据项
UniMemo2->Lines->Add(tmpStr);
try
{
jsonArray=jsonRecvMsg["userArray"]; //解析userArray数组
}
catch(...)
{
ShowMessage("解析失败:JSON报文中没有找到数组userArray");
return;
}
for(int i=0;i<jsonArray.size();i++)
{
if(jsonArray[i].isMember("userNo")) //判断数据项
{
tmpStr=jsonArray[i]["userNo"].asCString();//解析userNo数据项
UniMemo2->Lines->Add(tmpStr);
}
if(jsonArray[i].isMember("userName"))
{
tmpStr=jsonArray[i]["userName"].asCString();
UniMemo2->Lines->Add(tmpStr);
}
}}
4、运行效果
编译后,打开浏览器,访问http://localhost:8077,运行效果如下图所示: