技术类

Linux 上写C++ (7)——C++解析JSON

2020-04-02  本文已影响0人  漠北兄弟

        也下载过一些关于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;

}

上一篇下一篇

猜你喜欢

热点阅读