(14)uniGUI for C++ builder下如何玩转JSON

(中行雷威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

(14)uniGUI for C++ builder下如何玩转JSON(14)uniGUI for C++ builder下如何玩转JSON

3、添加json头文件和库文件目录

主菜单project-》options,在IncludePath和Library Path分别添加D:\testJson\json\include和D:\testJson\json\lib两个目录。

(14)uniGUI for C++ builder下如何玩转JSON(14)uniGUI for C++ builder下如何玩转JSON(14)uniGUI for C++ builder下如何玩转JSON

4、设置编译选项

(14)uniGUI for C++ builder下如何玩转JSON(14)uniGUI for C++ builder下如何玩转JSON

这两个编译选项是uniGUI项目必须设置的,我总是担心小白鼠们不知道,后续教程不在单独解释了哈。

二、代码实现

    如下图所示,在Main.cpp对应的MainForm窗口上布局两个UniMemo和两个UniBitBtn空间,第一个按钮打包一个JSON报文到UniMemo1里显示,第二个按钮解包JSON数据项到UniMemo2里显示。

(14)uniGUI for C++ builder下如何玩转JSON

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,运行效果如下图所示:

(14)uniGUI for C++ builder下如何玩转JSON

至此,一个如何调用、打包、解包JSON的功能就简单实现了,为了使用JSON,本人试过了开发工具自带的JSON报文解析功能还有网上的smartjson等,最终认为jsoncpp简单高效好用,犒赏大家。如需代码请访问我的QQ群文件共享,A02-源代码((14)uniGUI for C++ builder下如何玩转JSON)