美文网首页技术类
Linux 上写C++ (7)——C++解析JSON

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

作者: 漠北兄弟 | 来源:发表于2020-04-02 07:31 被阅读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;

    }

    相关文章

      网友评论

        本文标题:Linux 上写C++ (7)——C++解析JSON

        本文链接:https://www.haomeiwen.com/subject/sddtphtx.html