
{
"AppName": "GBUpperProxyServer",
"AppID": "51042100002000001100@node22:8001",
"CreateTime": 1650952032,
"LastHeartBeatTIme": 1652257370,
"TaskCount": 2,
"MAXTaskCount": 100000,
"Zone": "Dev",
"Env": "PRO",
"HostName": "node22",
"AddrS": [
"sip://node22:8001",
"sip://node23:8000"
],
"Version": "1.0.2.1.2022042501",
"Tenant": "",
"Weight": 100,
"Metadata": {
"GBID": "51042100002000001100",
"GBPassword": "12345678a"
}
}
申明结构体,并初始化部分变量:
typedef struct st_ServiceInfo {
std::string strAppName;
std::string strAppID;
long nCreateTime;
long nLastHeartBeatTIme;
std::string strZone;
std::string strEnv;
std::string strHostName;
std::list<std::string> listAddr;
long nTaskCount;
long nMAXTaskCount;
std::string strVersion;
std::string strTenant;
long nWeight;
std::string strMetadata;
//结构体初始化
st_ServiceInfo() {
nLastHeartBeatTIme = time(NULL);
nCreateTime = time(NULL);
nWeight = 5;
strVersion = "1.0.0";
nTaskCount = 0;
nMAXTaskCount = 0;
};
}ServiceInfo;
解析数据,并将子节点赋值给其他变量:
赋值子节点知识点:FastWriter(),也可以用StyleWriter()。
两者都可以将Json::Value转换为字符串。其中FastWriter结果是无格式的字符串。而StyleWriter是格式化的字符串。
int ParseJson(std::string strValue, ServiceInfo *stuServer)
{
if ( !strValue.empty())
{
Json::Reader reader;
Json::Value d;
if (!reader.parse(strValue, d))
{
return -1;
}
//解析常变量
if (d.isMember("AppName") && d["AppName"].isString())
{
stuServer->strAppName = d["AppName"].asString();
}
if (d.isMember("AppID") && d["AppID"].isString())
{
stuServer->strAppID = d["AppID"].asString();
}
if (d.isMember("CreateTime") && d["CreateTime"].isInt())
{
stuServer->nCreateTime = d["CreateTime"].asInt();
}
if (d.isMember("LastHeartBeatTIme") && d["LastHeartBeatTIme"].isInt())
{
stuServer->nLastHeartBeatTIme = d["LastHeartBeatTIme"].asInt();
}
if (d.isMember("TaskCount") && d["TaskCount"].isInt())
{
stuServer->nTaskCount = d["TaskCount"].asInt();
}
if (d.isMember("MAXTaskCount") && d["MAXTaskCount"].isInt())
{
stuServer->nMAXTaskCount = d["MAXTaskCount"].isInt();
}
if (d.isMember("Zone") && d["Zone"].isString())
{
stuServer->strZone = d["Zone"].asString();
}
if (d.isMember("Env") && d["Env"].isString())
{
stuServer->strEnv = d["Env"].asString();
}
if (d.isMember("HostName") && d["HostName"].isString())
{
stuServer->strHostName = d["HostName"].asString();
}
if (d.isMember("Version") && d["Version"].isString())
{
stuServer->strVersion = d["Version"].asString();
}
if (d.isMember("Weight") && d["Weight"].isInt())
{
stuServer->nWeight = d["Weight"].asInt();
}
//解析数组
if (d.isMember("AddrS") && d["AddrS"].isArray())
{
const Json::Value array = d["AddrS"];
int len = array.size();
for (int i = 0; i < len; i++)
{
if (array[i].isString())
{
stuServer->listAddr.push_back(array[i].asString());
}
}
}
//解析对象
if (d.isMember("Metadata") && d["Metadata"].isObject())
{
Json::Value value = d["Metadata"];
stuServer->strMetadata.assign(Json::FastWriter().write(value));
}
}
return 0;
}
直接解析json(常变量、数组、子节点)
void MethodChar()
{
Json::Reader reader;
Json::Value root;
//从文件中读取
ifstream is;
is.open("src.json", ios::binary);
cout << endl;
cout << "********************************************** MethodChar Result Print ************************************" << endl;
if (reader.parse(is, root))
{
ServiceInfo stuServer;
//解析常变量,跟前面一样
if (root.isMember("AppName") && root["AppName"].isString())
{
stuServer.strAppName = root["AppName"].asString();
}
if (root.isMember("AppID") && root["AppID"].isString())
{
stuServer.strAppID = root["AppID"].asString();
}
if (root.isMember("CreateTime") && root["CreateTime"].isInt())
{
stuServer.nCreateTime = root["CreateTime"].asInt();
}
if (root.isMember("LastHeartBeatTIme") && root["LastHeartBeatTIme"].isInt())
{
stuServer.nLastHeartBeatTIme = root["LastHeartBeatTIme"].asInt();
}
if (root.isMember("TaskCount") && root["TaskCount"].isInt())
{
stuServer.nTaskCount = root["TaskCount"].asInt();
}
if (root.isMember("MAXTaskCount") && root["MAXTaskCount"].isInt())
{
stuServer.nMAXTaskCount = root["MAXTaskCount"].isInt();
}
if (root.isMember("Zone") && root["Zone"].isString())
{
stuServer.strZone = root["Zone"].asString();
}
if (root.isMember("Env") && root["Env"].isString())
{
stuServer.strEnv = root["Env"].asString();
}
if (root.isMember("HostName") && root["HostName"].isString())
{
stuServer.strHostName = root["HostName"].asString();
}
if (root.isMember("Version") && root["Version"].isString())
{
stuServer.strVersion = root["Version"].asString();
}
if (root.isMember("Weight") && root["Weight"].isInt())
{
stuServer.nWeight = root["Weight"].asInt();
}
cout << "stuServer.strAppName: " << stuServer.strAppName << endl;
cout << "stuServer.strAppID: " << stuServer.strAppID << endl;
cout << "stuServer.nCreateTime: " << stuServer.nCreateTime << endl;
cout << "stuServer.nLastHeartBeatTIme: " << stuServer.nLastHeartBeatTIme << endl;
cout << "stuServer.strZone: " << stuServer.strZone << endl;
cout << "stuServer.strEnv: " << stuServer.strEnv << endl;
cout << "stuServer.strHostName: " << stuServer.strHostName << endl;
cout << "stuServer.nTaskCount: " << stuServer.nTaskCount << endl;
cout << "stuServer.nMAXTaskCount: " << stuServer.nMAXTaskCount << endl;
cout << "stuServer.strVersion: " << stuServer.strVersion << endl;
cout << "stuServer.strTenant: " << stuServer.strTenant << endl;
cout << "stuServer.nWeight: " << stuServer.nWeight << endl;
//解析数组
if (root.isMember("AddrS") && root["AddrS"].isArray())
{
for (int i = 0; i < root["AddrS"].size(); i++)
{
string ach = root["AddrS"][i].asString();
cout <<"AddrS: " << ach << "," << '\t';
}
cout << endl;
}
//读取子节点信息
string strGBID = root["Metadata"]["GBID"].asString();
string strPassword = root["Metadata"]["GBPassword"].asString();
cout << "strGBID: " << strGBID << endl;
cout << "strPassword: " << strPassword << endl;
}
cout << endl;
cout << "**********************************************END************************************" << endl;
cout << "Reading Complete!" << endl;
is.close();
}
测试代码
#include
#include
#include
#include
#include "json/json.h"
using namespace std;
typedef struct st_ServiceInfo {
std::string strAppName;
std::string strAppID;
long nCreateTime;
long nLastHeartBeatTIme;
std::string strZone;
std::string strEnv;
std::string strHostName;
std::list<std::string> listAddr;
long nTaskCount;
long nMAXTaskCount;
std::string strVersion;
std::string strTenant;
long nWeight;
std::string strMetadata;
//结构体初始化
st_ServiceInfo() {
nLastHeartBeatTIme = time(NULL);
nCreateTime = time(NULL);
nWeight = 5;
strVersion = "1.0.0";
nTaskCount = 0;
nMAXTaskCount = 0;
};
}ServiceInfo;
//json数据解析
int ParseJson(std::string strValue, ServiceInfo *stuServer)
{
if ( !strValue.empty())
{
Json::Reader reader;
Json::Value d;
if (!reader.parse(strValue, d))
{
return -1;
}
//解析常变量
if (d.isMember("AppName") && d["AppName"].isString())
{
stuServer->strAppName = d["AppName"].asString();
}
if (d.isMember("AppID") && d["AppID"].isString())
{
stuServer->strAppID = d["AppID"].asString();
}
if (d.isMember("CreateTime") && d["CreateTime"].isInt())
{
stuServer->nCreateTime = d["CreateTime"].asInt();
}
if (d.isMember("LastHeartBeatTIme") && d["LastHeartBeatTIme"].isInt())
{
stuServer->nLastHeartBeatTIme = d["LastHeartBeatTIme"].asInt();
}
if (d.isMember("TaskCount") && d["TaskCount"].isInt())
{
stuServer->nTaskCount = d["TaskCount"].asInt();
}
if (d.isMember("MAXTaskCount") && d["MAXTaskCount"].isInt())
{
stuServer->nMAXTaskCount = d["MAXTaskCount"].isInt();
}
if (d.isMember("Zone") && d["Zone"].isString())
{
stuServer->strZone = d["Zone"].asString();
}
if (d.isMember("Env") && d["Env"].isString())
{
stuServer->strEnv = d["Env"].asString();
}
if (d.isMember("HostName") && d["HostName"].isString())
{
stuServer->strHostName = d["HostName"].asString();
}
if (d.isMember("Version") && d["Version"].isString())
{
stuServer->strVersion = d["Version"].asString();
}
if (d.isMember("Weight") && d["Weight"].isInt())
{
stuServer->nWeight = d["Weight"].asInt();
}
//解析数组
if (d.isMember("AddrS") && d["AddrS"].isArray())
{
const Json::Value array = d["AddrS"];
int len = array.size();
for (int i = 0; i < len; i++)
{
if (array[i].isString())
{
stuServer->listAddr.push_back(array[i].asString());
}
}
}
//解析对象
if (d.isMember("Metadata") && d["Metadata"].isObject())
{
Json::Value value = d["Metadata"];
stuServer->strMetadata.assign(Json::FastWriter().write(value));
}
}
return 0;
}
void MethodObject()
{
Json::Reader reader;
Json::Value root;
//从文件中读取
ifstream is;
is.open("src.json", ios::binary);
if (reader.parse(is, root))
{
ServiceInfo stuServer;
std::string strValue;
strValue.assign(Json::FastWriter().write(root));
ParseJson(strValue, &stuServer);
cout << endl;
cout << "********************************************** MethodObject Result Print ************************************" << endl;
cout << "stuServer.strAppName: " << stuServer.strAppName << endl;
cout << "stuServer.strAppID: " << stuServer.strAppID << endl;
cout << "stuServer.nCreateTime: " << stuServer.nCreateTime << endl;
cout << "stuServer.nLastHeartBeatTIme: " << stuServer.nLastHeartBeatTIme << endl;
cout << "stuServer.strZone: " << stuServer.strZone << endl;
cout << "stuServer.strEnv: " << stuServer.strEnv << endl;
cout << "stuServer.strHostName: " << stuServer.strHostName << endl;
for (std::string& ite : stuServer.listAddr)
{
cout << "stuServer.listAddr: " << ite << endl;
}
cout << "stuServer.nTaskCount: " << stuServer.nTaskCount << endl;
cout << "stuServer.nMAXTaskCount: " << stuServer.nMAXTaskCount << endl;
cout << "stuServer.strVersion: " << stuServer.strVersion << endl;
cout << "stuServer.strTenant: " << stuServer.strTenant << endl;
cout << "stuServer.nWeight: " << stuServer.nWeight << endl;
if (stuServer.strMetadata.empty())
{
cout << "strMetadata is enpty" << '\t';
}
cout << endl;
Json::Reader reader;
Json::Value d;
if (!reader.parse(stuServer.strMetadata, d))
{
cout << "Parse strMetadata fail!" << endl;
}
std::string strGBID, strPassword;
if (d.isMember("GBID") && d["GBID"].isString())
{
strGBID = d["GBID"].asString();
cout << "strGBID: " << strGBID << endl;
}
if (d.isMember("GBPassword") && d["GBPassword"].isString())
{
strPassword = d["GBPassword"].asString();
cout << "strPassword: " << strPassword << endl;
}
cout << endl;
cout << "**********************************************END************************************" << endl;
cout << "Reading Complete!" << endl;
}
is.close();
}
void MethodChar()
{
Json::Reader reader;
Json::Value root;
//从文件中读取
ifstream is;
is.open("src.json", ios::binary);
cout << endl;
cout << "********************************************** MethodChar Result Print ************************************" << endl;
if (reader.parse(is, root))
{
ServiceInfo stuServer;
//解析常变量,跟前面一样
if (root.isMember("AppName") && root["AppName"].isString())
{
stuServer.strAppName = root["AppName"].asString();
}
if (root.isMember("AppID") && root["AppID"].isString())
{
stuServer.strAppID = root["AppID"].asString();
}
if (root.isMember("CreateTime") && root["CreateTime"].isInt())
{
stuServer.nCreateTime = root["CreateTime"].asInt();
}
if (root.isMember("LastHeartBeatTIme") && root["LastHeartBeatTIme"].isInt())
{
stuServer.nLastHeartBeatTIme = root["LastHeartBeatTIme"].asInt();
}
if (root.isMember("TaskCount") && root["TaskCount"].isInt())
{
stuServer.nTaskCount = root["TaskCount"].asInt();
}
if (root.isMember("MAXTaskCount") && root["MAXTaskCount"].isInt())
{
stuServer.nMAXTaskCount = root["MAXTaskCount"].isInt();
}
if (root.isMember("Zone") && root["Zone"].isString())
{
stuServer.strZone = root["Zone"].asString();
}
if (root.isMember("Env") && root["Env"].isString())
{
stuServer.strEnv = root["Env"].asString();
}
if (root.isMember("HostName") && root["HostName"].isString())
{
stuServer.strHostName = root["HostName"].asString();
}
if (root.isMember("Version") && root["Version"].isString())
{
stuServer.strVersion = root["Version"].asString();
}
if (root.isMember("Weight") && root["Weight"].isInt())
{
stuServer.nWeight = root["Weight"].asInt();
}
cout << "stuServer.strAppName: " << stuServer.strAppName << endl;
cout << "stuServer.strAppID: " << stuServer.strAppID << endl;
cout << "stuServer.nCreateTime: " << stuServer.nCreateTime << endl;
cout << "stuServer.nLastHeartBeatTIme: " << stuServer.nLastHeartBeatTIme << endl;
cout << "stuServer.strZone: " << stuServer.strZone << endl;
cout << "stuServer.strEnv: " << stuServer.strEnv << endl;
cout << "stuServer.strHostName: " << stuServer.strHostName << endl;
cout << "stuServer.nTaskCount: " << stuServer.nTaskCount << endl;
cout << "stuServer.nMAXTaskCount: " << stuServer.nMAXTaskCount << endl;
cout << "stuServer.strVersion: " << stuServer.strVersion << endl;
cout << "stuServer.strTenant: " << stuServer.strTenant << endl;
cout << "stuServer.nWeight: " << stuServer.nWeight << endl;
//解析数组
if (root.isMember("AddrS") && root["AddrS"].isArray())
{
for (int i = 0; i < root["AddrS"].size(); i++)
{
string ach = root["AddrS"][i].asString();
cout <<"AddrS: " << ach << "," << '\t';
}
cout << endl;
}
//读取子节点信息
string strGBID = root["Metadata"]["GBID"].asString();
string strPassword = root["Metadata"]["GBPassword"].asString();
cout << "strGBID: " << strGBID << endl;
cout << "strPassword: " << strPassword << endl;
}
cout << endl;
cout << "**********************************************END************************************" << endl;
cout << "Reading Complete!" << endl;
is.close();
}
int main()
{
cout << "###########方法1:解析josn数据到另外一个对象###########" << endl;
MethodObject();
cout << endl;
cout << "###########方法2:直接解析josn数据###########" << endl;
MethodChar();
getchar();
}
输出结果
###########方法1:解析josn数据到另外一个对象###########
********************************************** MethodObject Result Print ************************************
stuServer.strAppName: GBUpperProxyServer
stuServer.strAppID: 51042100002000001100@node22:8001
stuServer.nCreateTime: 1650952032
stuServer.nLastHeartBeatTIme: 1652257370
stuServer.strZone: Dev
stuServer.strEnv: PRO
stuServer.strHostName: node22
stuServer.listAddr: sip://node22:8001
stuServer.listAddr: sip://node23:8000
stuServer.nTaskCount: 2
stuServer.nMAXTaskCount: 1
stuServer.strVersion: 1.0.2.1.2022042501
stuServer.strTenant:
stuServer.nWeight: 100
strGBID: 51042100002000001100
strPassword: 12345678a
**********************************************END************************************
Reading Complete!
###########方法2:直接解析josn数据###########
********************************************** MethodChar Result Print ************************************
stuServer.strAppName: GBUpperProxyServer
stuServer.strAppID: 51042100002000001100@node22:8001
stuServer.nCreateTime: 1650952032
stuServer.nLastHeartBeatTIme: 1652257370
stuServer.strZone: Dev
stuServer.strEnv: PRO
stuServer.strHostName: node22
stuServer.nTaskCount: 2
stuServer.nMAXTaskCount: 1
stuServer.strVersion: 1.0.2.1.2022042501
stuServer.strTenant:
stuServer.nWeight: 100
AddrS: sip://node22:8001, AddrS: sip://node23:8000,
strGBID: 51042100002000001100
strPassword: 12345678a
**********************************************END************************************
Reading Complete!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)