使用jsoncpp解析json数据(常变量、数组、object对象(子节点)),包含(直接解析object,和将object对象

使用jsoncpp解析json数据(常变量、数组、object对象(子节点)),包含(直接解析object,和将object对象,第1张

josn源数据:
{
  "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!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/915132.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存