Linux 上写C++ (7)——C++解析JSON
也下载过一些关于C++解析JSON的方法,但是对方传过来的报文解析还是有问题,最后放弃自己写了一个方法,还比较好用,缺点就是子字段中再次出现同样的字段名称之后解析有问题,但是至少目前还没遇到这种情况。仅供参考
/*-----------------------------------------------------------------------------------------
创建时间:20160708
作者:lixy13 李小彦 QQ360741051
最后修改时间:20160701
IVR C++ 接口的核心代码
解析JSON字串代码
-------------------------------------------------------------------------------------------*/
#include "MYJSON.h" //头文件
#include <time.h> //时间
#include <stdio.h>
#include <unistd.h> //包含了Linux C 中的函数getcwd()
#include <stdlib.h>
#include <iostream>
#include <dirent.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netdb.h>
#include <ctime>
#include <fstream>
#include <cstring>
#include <string>
#include <cstring>
#include <sstream>
#include "IVR_COMMON.h" //通用类
#include <arpa/inet.h>extern int errno;
#define MODE (S_IRWXU | S_IRWXG | S_IRWXO)
#define FILEPATH_MAX (600)
using namespace std;
/*
文档描述:
文档:
*/
MYJSON::MYJSON() //构造函数
{
};
MYJSON::~MYJSON()//析构函数
{
};
IVR_COMMON common;
//字符转double lixy13 20160705
double MYJSON::StringToDouble( string value)
{
double dbValue=0;
char CTemp[50]="";
strcpy(CTemp,value.c_str());
dbValue = atof ( CTemp );
dbValue=atof(value.c_str());
return dbValue;
}
//double转char lixy13 20160705
string MYJSON::DoubleToChar( double value)
{
char CTemp[100]="";
gcvt(value,30,CTemp);
}
//double转string lixy13 20160705
string MYJSON::DoubleToString( double value)
{
ostringstream oss;
oss << value;
string strTemp = oss.str();
return strTemp;
}
//分割函数 得到传中 第K次出现的位置 lixy13 20160705
string MYJSON::MySplit( string StrParam, string StrSplit,int k)
{
string strValue=""; //零时变量
if(StrParam.empty()) //如果字串为空直接返回
{
return "";
}
if(StrSplit.empty()) //如果分割符为空 直接返回字串
{
return StrParam;
}
int SizeStrSplit=StrSplit.size();//分割字串长度
int LengthFirstSplit=0;//第一个分割位置的长度
int SizeParam=0;//字串长度
int num=0;//循环次数
while(LengthFirstSplit>=0)
{
SizeParam=StrParam.size();//获取字串长度
LengthFirstSplit= StrParam.find(StrSplit);//获取首次分割字串长度 LengthFirstSplit=-1 表示没有找到
string value=StrParam.substr(0,LengthFirstSplit);//获取value值 假如 LengthFirstSplit =-1 表示 value值和StrParam 相等
//如果两个字串一样表示没有找到字串,直接返回value
if(StrParam!=value)
{
//字串重新赋值,从上一个分割符开始,开始值需要加上分割字串长度
StrParam=StrParam.substr(LengthFirstSplit+SizeStrSplit,SizeParam);
//common.WriteLog("StrParam",StrParam);
//如果当前循环位置索引位置一样直接返回
if(num==k)
{
return value;
break;
}
}
else
{
return value;
break ;
}
// 防止死循环
if(num>1000)
{
cout<<"字符串太长..............."<<endl;
break ;
}
num++;
}
return strValue;
}
//从字串中根据key读取value值 json 返回值 分成两部分取值,response 部分 和 result response:字段值一般包含成功或失败标记,result,包含查询结果。
//取出第一次出现的位置的字段 lixy13 20160705
string MYJSON::GetValueJSON( string message,string key)
{
string temp="";
if(message.empty()||key.empty()||key.size()<=0)
{
temp="";
}
else
{
temp= MySplit(message,""+key+":\"",1);
//cout<<"temp-------------->>:"<<temp<<endl;
if(temp==message)
{
temp="";
}
else
{
temp= MySplit(temp,"\"",0);
}
}
common.WriteLog(key,temp);
return temp;
}
//根据字段获取value数组 lixy13 20160705
void MYJSON::GetArrayValue(string message,string field,string array_value[100])
{
if(message.empty()) //字串为空直接反馈
{
return ;
}
if(field.empty()) //字段为空直接反馈
{
return ;
}
int SizeStrSplit=field.size();//分割字串长度
int LengthFirstSplit=0;//第一个分割位置的长度
int SizeParam=0;//字串长度
int num=0;//循环次数
LengthFirstSplit= message.find(field);//获取首次分割字串长度
while(LengthFirstSplit>=0)
{
SizeParam=message.size();//获取字串长度
LengthFirstSplit= message.find(field);//获取首次分割字串长度
string value=message.substr(0,LengthFirstSplit);//获取value值
message=message.substr(LengthFirstSplit+SizeStrSplit,SizeParam);////字串重新复制,从上一个分割符开始,开始值需要加上分割字串长度
string temp= MySplit(message,"\",\"",0);//
//common.WriteLog("temp1",temp);
temp=temp.substr(2,temp.size());
//common.WriteLog("temp2",temp);
array_value[num]=temp;
LengthFirstSplit= message.find(field);//获取首次分割字串长度
// 防止死循环
if(num>1000)
{
cout<<"字符串分割异常"<<"..............."<<endl;
break ;
}
// 防止死循环
num++;
}
return ;
}
//根据字段获取value数组 lixy13 20160705
string MYJSON::GetArrayString(string message,string field)
{
string ArrayString="";
if(message.empty()) //字串为空直接反馈
{
return "";
}
if(field.empty()) //字段为空直接反馈
{
return "";
}
int SizeStrSplit=field.size();//分割字串长度
int LengthFirstSplit=0;//第一个分割位置的长度
int SizeParam=0;//字串长度
int num=0;//循环次数
LengthFirstSplit= message.find(field);//获取首次分割字串长度
common.WriteLog("GetArrayString,split(|||)",field);
while(LengthFirstSplit>=0)
{
SizeParam=message.size();//获取字串长度
LengthFirstSplit= message.find(field);//获取首次分割字串长度
//cout<<"LengthFirstSplit>>>>>>>:"<<LengthFirstSplit<<endl;
//string value=message.substr(0,LengthFirstSplit);//获取value值
//cout<<"value>>>>>>>:"<<value<<endl;
message=message.substr(LengthFirstSplit+SizeStrSplit+2,SizeParam);////字串重新复制,从上一个分割符开始,开始值需要加上分割字串长度
//cout<<"message>>>>>>>"<<message<<endl;
string temp= MySplit(message,"\"",0);//
//cout<<"temp>>>>>>>:"<<temp<<endl;
//temp=temp.substr(0,temp.size()-2);
//cout<<"temp>>>>>>>:"<<temp<<endl;
ArrayString=ArrayString+temp+";";
LengthFirstSplit= message.find(field);//获取首次分割字串长度
// 防止死循环
if(num>1000)
{
cout<<"字符串分割异常"<<"..............."<<endl;
break ;
}
// 防止死循环
num++;
}
return ArrayString;
}
//根据字段获取value数组 lixy13 20160705
string MYJSON::GetArrayStringSplit(string message,string fields)
{
string ArrayString="";
string split="|||";
string field="";
string value="";
bool istrue=true;
if(message.empty()) //字串为空直接反馈
{
return "";
}
int SizeStrSplit=split.size();//分割字串长度
int LengthFirstSplit=0;//第一个分割位置的长度
int SizeParam=0;//字串长度
int num=0;//循环次数
LengthFirstSplit= fields.find(split);//获取首次分割字串长度
common.WriteLog("fields",fields);
//cout<<"LengthFirstSplit>>>>>>>:"<<LengthFirstSplit<<endl;
//cout<<"istrue>>>>>>>:"<<istrue<<endl;
while(istrue&&LengthFirstSplit>=0)
{
//ArrayString=ArrayString+temp+";";
SizeParam=fields.size();//获取字串长度
LengthFirstSplit= fields.find(split);//获取首次分割字串长度
//cout<<"LengthFirstSplit>>>>>>>:"<<LengthFirstSplit<<endl;
string field=fields.substr(0,LengthFirstSplit);//获取value值
//cout<<"value>>>>>>>:"<<value<<endl;
fields=fields.substr(LengthFirstSplit+SizeStrSplit,SizeParam);////字串重新复制,从上一个分割符开始,开始值需要加上分割字串长度
//cout<<"field>>>>>>>:"<<field<<endl;
if(field=="")
{
istrue=false;
cout<<"结束"<<"..............."<<endl;
}
else
{
value=GetArrayString( message, field);
//cout<<"value>>>>>>>:"<<value<<endl;
ArrayString=ArrayString+value+"|||";
cout<<"ArrayString>>>>>>>:"<<ArrayString<<endl;
//LengthFirstSplit = fields.find(split);//获取首次分割字串长度
}
// 防止死循环
if(num>100)
{
istrue=false;
cout<<"字符串分割异常"<<"..............."<<endl;
break ;
}
// 防止死循环
num++;
}
return ArrayString;
}
//判断字串是否已经在数组中 lixy13 20160705
bool MYJSON::CheckIsHave(string Array[100], string key)
{
for(int i=0;i<100;i++)
{
if(Array[i].empty() ||Array[i]=="")
{
break;
}
else
{
if(Array[i]==key)
{
return true;
}
}
}
return false;
}
//相同的字串值相加ArrayOne 键 ArrayTwo 值 lixy13 20160705
double MYJSON::GetValueADD(string ArrayOne[100],string ArrayTwo[100], string key)
{
double value=0;
for(int i=0;i<100;i++)
{
if(ArrayOne[i].empty() ||ArrayOne[i]=="")
{
break;
}
else
{
if(ArrayOne[i]==key)
{
value=value+ StringToDouble( ArrayTwo[i] );
common.WriteLog("value",value);
}
}
}
return value;
}
//拼接短信 lixy13 20160705
string MYJSON::GetSMSAdd(string strDataResult,string fieldOne,string fieldTwo)
{
string strSMS="";//短信
string ArrayOne[100];//数组1
string ArrayTwo[100];//数据2
string ArrayINTEGRATEITEM[100];
GetArrayValue( strDataResult, fieldOne,ArrayOne);//获取数组1
GetArrayValue( strDataResult, fieldTwo,ArrayTwo);//获取数组2
string strFEE="";//金额
double db_FEE=0;//金额double
int k=0;
// 第一步 去重复
for(int i=0;i<100;i++)
{
if(ArrayOne[i].empty() ||ArrayOne[i]=="")
{
break;
}
else
{
bool blIsHave=CheckIsHave( ArrayINTEGRATEITEM,ArrayOne[i]);
if(!blIsHave)
{
ArrayINTEGRATEITEM[k]=ArrayOne[i];
k++;
}
}
}
//第二步:累加
for(int i=0;i<100;i++)
{
if(ArrayINTEGRATEITEM[i].empty() ||ArrayINTEGRATEITEM[i]=="")
{
break;
}
else
{
common.WriteLog("ArrayINTEGRATEITEM:",ArrayINTEGRATEITEM[i]);
double dbFEE= GetValueADD( ArrayOne,ArrayTwo,ArrayINTEGRATEITEM[i]);
dbFEE=dbFEE/100;//金额需要除去100单位是分
string strFee=DoubleToString( dbFEE);
strSMS=strSMS+ArrayINTEGRATEITEM[i]+":"+strFee+";";
}
}
common.WriteLog("SMS:",strSMS);
return strSMS;
}