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

(中行雷威2018.6.1)

(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943、860634510、299497712,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)

【阅读倡议】

1、有问题请留言;

2、没问题请点赞;

3、看连载请加群;

4、下源码请加群;

【开发工具】

1、C++Builder10.2.2tokyo

2、FMSoft_uniGUI_Complete_Professional_1.10.0build1462(正版)

本人主笔的国内第一本uniGUI教学案例代码已诞生,分为cbuilder和delphi两个版本,买代码送手册,需要的朋友可以加入我的QQ技术交流群484979943、860634510、299497712给我(群主)留言。资料简介:https://blog.csdn.net/dlboy2018/article/details/88923832

 

今天是六一儿童节,醒的早了点,无聊至极,把前段时间关于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,运行效果如下图所示:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将netCDF格式的气象数据转换成JSON格式可以使用C++JSON库和netCDF库来实现。下面是一个简单的示例,演示如何将netCDF文件中的气象数据转换成JSON格式。 ```c++ #include <iostream> #include <netcdf> #include <nlohmann/json.hpp> using namespace std; using namespace netCDF; using json = nlohmann::json; int main() { // 打开netCDF文件 NcFile dataFile("data.nc", NcFile::read); // 读取气象数据 NcVar tempVar = dataFile.getVar("temperature"); NcVar windDirVar = dataFile.getVar("wind_direction"); NcVar windSpeedVar = dataFile.getVar("wind_speed"); // 获取气象数据的维度 NcDim latDim = tempVar.getDim(0); NcDim lonDim = tempVar.getDim(1); NcDim timeDim = tempVar.getDim(2); // 读取气象数据 int latSize = latDim.getSize(); int lonSize = lonDim.getSize(); int timeSize = timeDim.getSize(); int tempData[latSize][lonSize][timeSize]; int windDirData[latSize][lonSize][timeSize]; int windSpeedData[latSize][lonSize][timeSize]; tempVar.getVar(tempData); windDirVar.getVar(windDirData); windSpeedVar.getVar(windSpeedData); // 将气象数据转换成JSON格式 json jsonData; for(int i=0; i<latSize; i++) { for(int j=0; j<lonSize; j++) { for(int k=0; k<timeSize; k++) { json data; data["lat"] = i; data["lon"] = j; data["time"] = k; data["temperature"] = tempData[i][j][k]; data["wind_direction"] = windDirData[i][j][k]; data["wind_speed"] = windSpeedData[i][j][k]; jsonData.push_back(data); } } } // 输出JSON格式的气象数据 cout << jsonData.dump() << endl; return 0; } ``` 在这个示例中,我们读取了名为"data.nc"的netCDF文件中的气象数据,并将其转换成JSON格式。首先,我们读取了三个变量:"temperature"、"wind_direction"和"wind_speed",并获取了它们的维度。然后,我们读取了气象数据,并将其转换成JSON格式。最后,我们输出了JSON格式的气象数据。 需要注意的是,这个示例中的JSON库采用的是nlohmann/json库,你需要先安装该库,安装方法可以参考官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值