• 1838阅读
  • 3回复

Qt小工具-Json数据转结构体 [复制链接]

上一主题 下一主题
离线boylebao
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2022-08-17
如果给你一组json数据,需要将它的所有变量声明为一个结构体,也许简单的json数据你能做到,也很乐意做,但你给一组复杂的json数据就不知如何着手做了。为了解决这个痛点,我开发了这款软件,可以将一组json数据转化为结构体定义,同时,还可以转换为解析json的Qt代码,帮助你省去解析json的时间,非常高效。nice!


效果如下:
图1转为结构体




图2转为解析json代码




json数据
  1. {
  2.   "code": "200",
  3.   "updateTime": "2020-06-30T22:00+08:00",
  4.   "fxLink": "http://hfx.link/2ax1",
  5.   "now": {
  6.     "obsTime": "2020-06-30T21:40+08:00",
  7.     "temp": "24",
  8.     "feelsLike": "26",
  9.     "icon": "101",
  10.     "text": "??",
  11.     "wind360": "123",
  12.     "windDir": "???",
  13.     "windScale": "1",
  14.     "windSpeed": "3",
  15.     "humidity": "72",
  16.     "precip": "0.0",
  17.     "pressure": "1003",
  18.     "vis": "16",
  19.     "cloud": "10",
  20.     "dew": "21"
  21.   },
  22.   "refer": {
  23.     "sources": [
  24.       "QWeather",
  25.       "NMC",
  26.       "ECMWF"
  27.     ],
  28.     "license": [
  29.       "commercial license"
  30.     ]
  31.   }
  32. }



生成结构体代码
  1. struct Now
  2. {
  3.     QString cloud;
  4.     QString dew;
  5.     QString feelsLike;
  6.     QString humidity;
  7.     QString icon;
  8.     QString obsTime;
  9.     QString precip;
  10.     QString pressure;
  11.     QString temp;
  12.     QString text;
  13.     QString vis;
  14.     QString wind360;
  15.     QString windDir;
  16.     QString windScale;
  17.     QString windSpeed;
  18.     Now()
  19.     {
  20.         cloud = "10";
  21.         dew = "21";
  22.         feelsLike = "26";
  23.         humidity = "72";
  24.         icon = "101";
  25.         obsTime = "2020-06-30T21:40+08:00";
  26.         precip = "0.0";
  27.         pressure = "1003";
  28.         temp = "24";
  29.         text = "??";
  30.         vis = "16";
  31.         wind360 = "123";
  32.         windDir = "???";
  33.         windScale = "1";
  34.         windSpeed = "3";
  35.     }
  36. };
  37. struct Refer
  38. {
  39.     QStringList license;
  40.     QStringList sources;
  41.     Refer()
  42.     {
  43.         license << "commercial license";
  44.         sources << "QWeather";
  45.         sources << "NMC";
  46.         sources << "ECMWF";
  47.     }
  48. };
  49. struct Undefined
  50. {
  51.     QString code;
  52.     QString fxLink;
  53.     Now now;
  54.     Refer refer;
  55.     QString updateTime;
  56.     Undefined()
  57.     {
  58.         code = "200";
  59.         fxLink = "http://hfx.link/2ax1";
  60.         updateTime = "2020-06-30T22:00+08:00";
  61.     }
  62. };
生成解析json代码

  1. QString jsonText = "";
  2.     auto filePath = QString("D:/TestCode/build-Json2Code-Desktop_Qt_5_15_2_MinGW_64_bit-Release/2.json");//请补充json文件路径
  3.     QFile file(filePath);
  4.     if(file.open(QFile::ReadOnly))
  5.     {
  6.         auto data = file.readAll();
  7.         file.close();
  8.         jsonText = QString::fromUtf8(data);
  9.     }
  10.     QJsonParseError error;
  11.     auto doc = QJsonDocument::fromJson(jsonText.toUtf8(),&error);
  12.     if(error.error == QJsonParseError::NoError)
  13.     {
  14.         Undefined mUndefined;
  15.         auto rootObject = doc.object();
  16.         mUndefined.code = rootObject.value("code").toString();
  17.         mUndefined.fxLink = rootObject.value("fxLink").toString();
  18.         mUndefined.updateTime = rootObject.value("updateTime").toString();
  19.         auto nowObject = rootObject.value("now").toObject();
  20.         mUndefined.now.cloud = nowObject.value("cloud").toString();
  21.         mUndefined.now.dew = nowObject.value("dew").toString();
  22.         mUndefined.now.feelsLike = nowObject.value("feelsLike").toString();
  23.         mUndefined.now.humidity = nowObject.value("humidity").toString();
  24.         mUndefined.now.icon = nowObject.value("icon").toString();
  25.         mUndefined.now.obsTime = nowObject.value("obsTime").toString();
  26.         mUndefined.now.precip = nowObject.value("precip").toString();
  27.         mUndefined.now.pressure = nowObject.value("pressure").toString();
  28.         mUndefined.now.temp = nowObject.value("temp").toString();
  29.         mUndefined.now.text = nowObject.value("text").toString();
  30.         mUndefined.now.vis = nowObject.value("vis").toString();
  31.         mUndefined.now.wind360 = nowObject.value("wind360").toString();
  32.         mUndefined.now.windDir = nowObject.value("windDir").toString();
  33.         mUndefined.now.windScale = nowObject.value("windScale").toString();
  34.         mUndefined.now.windSpeed = nowObject.value("windSpeed").toString();
  35.         auto referObject = rootObject.value("refer").toObject();
  36.         auto licenseArray = referObject.value("license").toArray();
  37.         for (int i = 0; i < licenseArray.size(); i++)
  38.         {
  39.             mUndefined.refer.license[i] = licenseArray.at(i).toString();
  40.         }
  41.         auto sourcesArray = referObject.value("sources").toArray();
  42.         for (int i = 0; i < sourcesArray.size(); i++)
  43.         {
  44.             mUndefined.refer.sources[i] = sourcesArray.at(i).toString();
  45.         }
  46.     }

工程测试效果





4条评分好评度+1贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 2022-08-17
20091001753 贡献值 +1 - 2022-08-17
20091001753 威望 +1 - 2022-08-17
20091001753 金钱 +10 - 2022-08-17
为Qt打造具有强大生产力的软件。
离线zy1233

只看该作者 1楼 发表于: 2022-08-17
nice,我也写过类似的,不过后来json用的少都找不到了,可否exe发出来
离线boylebao

只看该作者 2楼 发表于: 2022-08-17
经过下午编写,完成了整个环节的链接。
总体就是,json数据->结构体,json数据->生成解析代码存到结构体中,结构体->生成保存json代码。

根据结构体生成保存json代码




测试保存json文件与原json文件数据一致




为Qt打造具有强大生产力的软件。
离线boylebao

只看该作者 3楼 发表于: 2022-08-17
回 zy1233 的帖子
zy1233:nice,我也写过类似的,不过后来json用的少都找不到了,可否exe发出来 (2022-08-17 15:14) 

等完善了发出来
为Qt打造具有强大生产力的软件。
快速回复
限100 字节
 
上一个 下一个