【C++】封装使用jsoncpp的类

6 篇文章 0 订阅

封装使用jsoncpp的类包括5种功能

1.是否存在节点

    bool IsNodeExisted(string jsonObj, string strNode);   

2.为数组增加元素

    int AppendArrayObject(string& jsonObj, string strNode, string strValue);

3.获取节点值

   int GetJsonValue(string jsonObj,string strNode,string& strOut);

4.设置节点值

   int SetJsonObejct(string& jsonObj, string strNode, string strValue);

5.获取对象节点列表

   int GetJsonChildNodeArray(string jsonObj, string strNode,vector<string>& vecChildNode);

**************************************************************************************************

JsonBase.h

**************************************************************************************************

#pragma once
#include "json/reader.h"
#include <sstream>
#include <algorithm>
using namespace std;

#pragma comment(lib,"json/json_vc71_libmtd.lib")

class JsonBase
{
public:
    JsonBase(void);
    ~JsonBase(void);
public:
    bool IsNodeExisted(string jsonObj, string strNode);

    int AppendArrayObject(string& jsonObj, string strNode, string strValue);
    int GetJsonValue(string jsonObj,string strNode,string& strOut);
    int GetJsonChildNodeArray(string jsonObj, string strNode,vector<string>& vecChildNode);
    int SetJsonObejct(string& jsonObj, string strNode, string strValue);
private:
    bool ReadJson(string jObect, Json::Value& root);
    bool GetJsonObject(Json::Value &jsonObj, string strValue);
};


**************************************************************************************************

JsonBase.cpp

**************************************************************************************************

#include "JsonBase.h"
#include "json/reader.h"
#include <sstream>
#include <algorithm>

using namespace std;
enum ReturnType
{
    RET_ERROR = -1,
    RET_OK
};

//声明
void ConvertStr(string& str);
void TrimQuotationMarks(string& str);
void RemoveSpaceAndLineFeed(string& strSource);
bool ContainObject(string strValue, Json::Value &jsonObj);

string ReturnJsonIndexString(Json::Value jObejct, string strValue);
string&   replace_all(string&   str,const   string&   old_value,char new_value);
vector<string> SplitObject(string strNode);
vector<string> GetChildNodList(Json::Value jObejct, string strValue);
vector<string> split(const string& src, string delimit,string null_subst);

vector<string> split(const string& src, string delimit,string null_subst="")  
{  
    typedef basic_string<char>::size_type S_T;  
    static const S_T npos = -1;  

    if( src.empty() || delimit.empty() )   
        throw "split: empty string\0";  

    vector<string> v;  
    S_T deli_len = delimit.size();  
    unsigned int index = npos, last_search_position = 0;  
    while( (index=src.find(delimit, last_search_position))!=npos )  
    {  
        if(index==last_search_position)  
            v.push_back(null_subst);  
        else  
            v.push_back( src.substr(last_search_position, index-last_search_position) );  
        last_search_position = index + deli_len;  
    }  
    string last_one = src.substr(last_search_position);  
    v.push_back( last_one.empty()? null_subst:last_one );  
    return v;  
}
vector<string> SplitObject(string strNode)
{
    vector<string> vecRet;
    for (size_t i=0; i<strNode.size(); i++)
    {
        if (strNode[i] == '.')
        {
            vecRet.push_back(strNode.substr(0, i));
        }
        else if (strNode[i] == '[')
        {
            string strTemp = strNode.substr(0,i);
            if (strTemp != "")
            {
                vecRet.push_back(strTemp);
            }
        }
    }
    if (strNode != "")
    {
        vecRet.push_back(strNode);
    }
    return vecRet;
}
vector<string> GetChildNodList(Json::Value jObejct, string strValue)
{
    //查找该节点
    vector<string> vecArray = split(strValue,".");

    bool bFlag = true;
    Json::Value jsonObj = jObejct;
    for (size_t i=0; i<vecArray.size(); i++)
    {
        if (!jsonObj.isMember(vecArray[i]))
        {
            bFlag = false;
            break;
        }
        if (i<vecArray.size())
        {
            jsonObj = jsonObj.get(vecArray[i],NULL);
        }
    }	
    Json::Value jsonChildNode= jsonObj[vecArray[vecArray.size()-1]];
    return jsonChildNode.getMemberNames();
}
bool JsonBase::ReadJson(string jObect, Json::Value& root)
{
    Json::Reader jsonReader;

    if (!jsonReader.parse(jObect, root))
    {
        cout<<"解析Json数据结构失败!\n";
        return false;
    }
    return true;
}
void RemoveSpaceAndLineFeed(string& strSource)
{
    string strRet;
    for (size_t i=0; i< strSource.size(); i++)
    {
        if (strSource[i] != ' ' && strSource[i] != '\n')
        {
            strRet += strSource[i];
        }
    }
    strSource = strRet;
}

bool JsonBase::GetJsonObject(Json::Value &jsonObj, string strValue) 
{
    if (strValue == "")
    {
        return true;
    }

    vector<string> vecArray = split(strValue,".");
    for (size_t i=0; i<vecArray.size(); i++)
    {
        string strKey = vecArray[i];

        int nStart = strKey.find('[');
        int nEnd   = strKey.find(']');

        if (-1 != nStart && -1 != nEnd)
        {
            size_t nPos = -1;
            sscanf(strKey.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);

            string strTempKey = "";
            if (nStart != 0)
            {
                strTempKey = strKey.substr(0,nStart);
            }			

            if (strTempKey != "")
            {				
                if (jsonObj.type() != Json::objectValue)
                {
                    cout<<"当前节点不是对象!\n";
                    return false;
                }
                if (!jsonObj.isMember(strTempKey))
                {
                    cout<<"节点不存在!\n";
                    return false;
                }
                if (i<vecArray.size())
                {
                    jsonObj = jsonObj.get(strTempKey,NULL);	
                }
            }

            do 
            {
                Json::ValueType valueType = jsonObj.type();
                if (valueType == Json::arrayValue)
                {
                    if (nPos < 0)
                    {
                        int nSize = jsonObj.size();
                        //负数下标不能超过size大小
                        if (nPos*(-1) > nSize)
                        {
                            cout<<"节点下标越界!\n";
                            return false;							
                        }
                        nPos = nPos % nSize;
                        if (nPos != 0)
                        {
                            nPos += nSize;
                        }
                    }
                    else if (nPos > jsonObj.size()-1)
                    {
                        cout<<"节点下标越界!\n";
                        return false;
                    }

                    jsonObj = jsonObj.get(nPos,NULL);
                }
                else
                {
                    cout<<"节点不是数组!\n";                    
                    return false;
                }

                strKey = strKey.substr(nEnd+1);
                nStart = strKey.find('[');
                nEnd   = strKey.find(']');

                sscanf(strKey.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);
            } while (-1 != nStart && -1 != nEnd);
        }
        else 
        {
            if (jsonObj.type() != Json::objectValue)
            {
                cout<<"节点不是数组!\n"; 
                return false;
            }
            if (!jsonObj.isMember(strKey))
            {
                cout<<"节点不存在!\n";
                return false;
            }
            if (i<vecArray.size())
            {
                jsonObj = jsonObj.get(strKey,NULL);
            }
        }
    }	
    return true;
}
JsonBase::JsonBase(void)
{

}
JsonBase::~JsonBase(void)
{

}
int JsonBase::SetJsonObejct(string& jsonObj, string sNode, string strValue)
{
    Json::Value root;
    if (!ReadJson(jsonObj, root))
    {
        return RET_ERROR;
    }	

    string strPreNode; //前一个节点
    string strNode;    //当前节点
    Json::Value obj = root; //当前节点对象

    //需先将值转化为对象
    Json::Reader jsonReader;
    Json::Value newObject;
    jsonReader.parse(strValue, newObject);

    //判断输入,字符串必须以引号括起来
    string strVal = strValue;
    int nStart = strVal.find('\"');
    int nEnd   = strVal.find_last_of('\"');
    if (newObject.type() == Json::stringValue || newObject.type() == Json::nullValue)
    {
        if (!(0 == nStart && strVal.size()-1 == nEnd))
        {
            cout<<"值参数输入错误!\n";
            return RET_ERROR;
        }
        else
        {
            TrimQuotationMarks(strVal);
        }
    }

    string strKey = sNode; 
    vector<string> vecObject = SplitObject(strKey);

    obj = newObject;
    if (newObject.type() == Json::stringValue || newObject.type() == Json::nullValue)
    {
        obj = strVal;
    }
    for (size_t i=vecObject.size()-1; i>=0; i--)
    {
        //节点为空,代表改root
        if (vecObject.size() == 0)
        {
            if (newObject.type() == Json::stringValue || newObject.type() == Json::nullValue)
            {
                root = strVal;
            }
            else
            {
                root = newObject;
            }
            obj = root;
            break;
        }

        strNode = vecObject[i];
        //最后一条
        if (i == 0)
        {
            int nStart = strNode.find('[');
            int nEnd   = strNode.find(']');

            if (-1 != nStart && -1 != nEnd)
            {
                int nPos = -1;
                sscanf(strNode.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);
                if (!root.isArray())
                {
                    return RET_ERROR;
                }

                if (nPos < 0)
                {
                    int nSize = root.size();
                    //负数下标不能超过size大小
                    if (nPos*(-1) > nSize)
                    {
                        cout<<"节点下标越界!\n";
                        return RET_ERROR;
                    }
                    nPos = nPos % nSize;
                    if (nPos != 0)
                    {
                        nPos += nSize;
                    }
                }
                else if (nPos > root.size()-1)
                {
                    cout<<"节点下标越界!\n";
                    return RET_ERROR;
                }
                if (obj.type() == Json::stringValue || obj.type() == Json::nullValue)
                {
                    root[nPos] = strVal;
                }
                else
                {
                    root[nPos] = obj;
                }
            }
            else
            {
                if (root.type() != Json::objectValue)
                {
                    cout<<"当前节点不是对象!\n";
                    return RET_ERROR;
                }
                if (obj.type() == Json::stringValue || obj.type() == Json::nullValue)
                {
                    root[strNode] = strVal;
                }
                else
                {
                    root[strNode] = obj;
                }
            }
            obj = root;
            break;
        }

        strPreNode = vecObject[i-1];
        Json::Value tempObject = root; 

        if (!GetJsonObject(tempObject, strPreNode))
        {
            cout<<"节点不存在!\n";
            return RET_ERROR;
        }  

        //获取Key
        if (strNode.substr(strPreNode.size(),1) == ".")
        {
            strKey = strNode.substr(strPreNode.size()+1);
        }  
        else
        {
            strKey = strNode.substr(strPreNode.size());
        }
        //key为数组下标
        int nStart = strKey.find('[');
        int nEnd   = strKey.find(']');

        if (-1 != nStart && -1 != nEnd)
        {
            int nPos = -1;
            sscanf(strKey.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);
            if (!tempObject.isArray())
            {
                cout<<"节点不是数组!\n";
                return RET_ERROR;
            }
            if (nPos < 0)
            {
                int nSize = tempObject.size();
                //负数下标不能超过size大小
                if (nPos*(-1) > nSize)
                {
                    cout<<"节点下标越界!\n";
                    return RET_ERROR;
                }
                nPos = nPos % nSize;
                if (nPos != 0)
                {
                    nPos += nSize;
                }
            }
            else if (nPos >tempObject.size()-1)
            {
                cout<<"节点下标越界!\n";
                return RET_ERROR;
            }
            tempObject[nPos] = obj;
        }
        else
        {
            tempObject[strKey] = obj;
        }
        obj = tempObject;
    }
    root = obj;
    jsonObj = root.toStyledString();
    return RET_OK;
}

string ReturnJsonIndexString(Json::Value jObejct, string strValue)
{
    string strKey = strValue;
    int nStart = strKey.find('[');
    int nEnd   = strKey.find(']');
    if (-1 != nStart && -1 != nEnd)
    {
        int nPos = -1;
        sscanf(strKey.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);
        if (nPos < 0)
        {
            cout<<"数组下标不正确!\n";
            return "";
        }
        string strTempKey = strKey.substr(0,nStart);
        vector<string> retVec = GetChildNodList(jObejct,strTempKey);
        cout<<"members.size()="<<retVec.size()<<endl;
        for (size_t k=0; k<retVec.size(); k++)
        {
            cout<<"members["<<k<<"]="<<retVec[k]<<endl;
        }
        string strIndex = retVec[nPos];
        string strRet = strKey.substr(0,nStart) + "." + strIndex + strKey.substr(nEnd+1);
        strValue = strRet;
        return ReturnJsonIndexString(jObejct, strValue);
    }
    else
    {
        return strValue;
    }
}
string&   replace_all(string&   str,const   string&   old_value,char new_value)     
{     
    while(true)   {     
        string::size_type   pos(0);     
        if(   (pos=str.find(old_value))!=string::npos   ) 
        {
            string strTemp;
            strTemp += str.substr(0,pos);
            strTemp += new_value;
            strTemp += str.substr(pos+old_value.size());
            str = strTemp;
        }
        else   break;     
    }     
    return   str;     
}  
void TrimQuotationMarks(string& str)
{
    if (0 == str.find('\"'))
    {
        str = str.substr(1);
    }
    if ( str.size()-1 == str.find_last_of('\"'))
    {
        str = str.substr(0,str.size()-1);
    }
}
void ConvertStr(string& str)
{
    string strVal = str;
    strVal = replace_all(strVal,"\\b",'\b');
    strVal = replace_all(strVal,"\\f",'\f');	
    strVal = replace_all(strVal,"\\n",'\n');
    strVal = replace_all(strVal,"\\r",'\r');
    strVal = replace_all(strVal,"\\t",'\t');
    strVal = replace_all(strVal,"\\\"",'\"');
    strVal = replace_all(strVal,"\\\'",'\'');
    strVal = replace_all(strVal,"\\\\",'\\');

    str = strVal;
}
int JsonBase::GetJsonValue(string jsonObj,string strNode,string& strOut)
{
    Json::Value root;
    if (!ReadJson(jsonObj, root))
    {
        return RET_ERROR;
    }

    bool bFlag = true;
    Json::Value jObject = root;
    if (strNode != "")
    {
        bFlag  = GetJsonObject(jObject, strNode);
    }  

    string strRet = "";
    if (!bFlag)
    {
       strOut = strRet;
       return RET_ERROR;
    }
    else
    {
        strRet = jObject.toStyledString();
        strRet = strRet.substr(0,strRet.size()-1);
        if (jObject.type() != Json::objectValue)
        {
            ConvertStr(strRet);
            TrimQuotationMarks(strRet);
        }
        strOut = strRet;
        return jObject.type();
    }
    return RET_OK;	
}

int JsonBase::GetJsonChildNodeArray(string jObject, string strNode,vector<string>& vecChildNode)
{
    Json::Value root;
    if (!ReadJson(jObject, root))
    {
        return RET_ERROR;
    }	
    Json::Value jsonObj = root;

    //查找该节点
    if (!GetJsonObject(jsonObj, strNode))
    {
        cout<<"节点不存在!\n";
        return RET_ERROR;
    }  

    string strRet,strTemp;
    //清空返回值内容
    if (!vecChildNode.empty())
    {
        vecChildNode.clear();
    }

    if (jsonObj.type() == Json::objectValue)
    {
        Json::Value::Members members = jsonObj.getMemberNames();
        Json::Value::Members::iterator it = members.begin();
        while (it != members.end())
        {
            strTemp = *it;
            strTemp = strTemp.substr(0,strTemp.size());
            vecChildNode.push_back(strTemp);
            it++;
        }
    }
    else if (jsonObj.type() == Json::arrayValue)
    {
        for (size_t i=0; i<jsonObj.size(); i++)
        {
            strTemp = jsonObj[i].toStyledString();
            strTemp = strTemp.substr(0,strTemp.size()-1);
            if (jsonObj[i].type() != Json::objectValue)
            {
                ConvertStr(strTemp);
                TrimQuotationMarks(strTemp);
            }
            vecChildNode.push_back(strTemp);
        }
    }
    else
    {
        return RET_ERROR;
    }	
    return RET_OK;
}

bool ContainObject(string strValue, Json::Value &jsonObj)
{
    if (!jsonObj.isMember(strValue))
    {
        return false;
    }
    jsonObj = jsonObj[strValue];
    return true;
}
bool JsonBase::IsNodeExisted(string jObject, string strNode)
{
    Json::Value root;
    if (!ReadJson(jObject, root))
    {
        return false;
    }

    string strValue =strNode;
    if (strValue == "")
    {
        cout<<"输入字符串为空!\n";
        return false;
    }

    vector<string> vecArray = SplitObject(strValue,".");

    for (size_t i=0; i<vecArray.size(); i++)  
    {  
        Json::Value jsonObj = root; 
        if (!GetJsonObject(jsonObj, vecArray[i]))
        {
            return false;
        }  
    }  
    return true;
}

int JsonBase::AppendArrayObject(string& jsonObj, string sNode, string strValue)
{
    Json::Value root;
    if (!ReadJson(jsonObj,root))
    {
        return RET_ERROR;
    }

    string strPreNode;   //前一个节点
    string strNode;      //当前节点
    Json::Value obj = root; //当前节点对象

    //需先将值转化为对象
    Json::Reader jsonReader;
    Json::Value newObject;
    jsonReader.parse(strValue, newObject);

    string strKey = sNode; 
    vector<string> vecObject;

    //append root节点
    if (strKey == "")
    {
        if (!root.isArray())
        {
            cout<<"节点不是数组!\n";
            return RET_ERROR;
        }
        if (newObject.type() == Json::stringValue || newObject.type() == Json::nullValue)
        {
            root.append(strValue);
        }
        else
        {
            root.append(newObject);
        }
        obj = root;
    }
    else
    {
        vecObject = SplitObject(strKey);

        //只有单个节点,操作root
        if (vecObject.size() == 0)
        {
            int nStart = strKey.find('[');
            int nEnd   = strKey.find(']');
            if (-1 != nStart && -1 != nEnd)
            {
                int nPos = -1;
                sscanf(strKey.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);

                if (nPos < 0)
                {
                    int nSize = root.size();
                    //负数下标不能超过size大小
                    if (nPos*(-1) > nSize)
                    {
                        cout<<"节点下标越界!\n";
                        return RET_ERROR;
                    }
                    nPos = nPos % nSize;
                    if (nPos != 0)
                    {
                        nPos += nSize;
                    }
                }
                else if (nPos > root.size()-1)
                {
                    cout<<"节点下标越界!\n";
                    return RET_ERROR;
                }
                if (newObject.type() == Json::stringValue || newObject.type() == Json::nullValue)
                {
                    root[nPos].append(strValue);
                }
                else
                {
                    root[nPos].append(newObject);
                }
            }
            else
            {
                if (newObject.type() == Json::stringValue || newObject.type() == Json::nullValue)
                {
                    root[strKey].append(strValue);
                }
                else
                {
                    root[strKey].append(newObject);
                }
            }
            obj = root;
        }
        else
        {
            //插入点
            Json::Value jObejct = root;
            if (!GetJsonObject(jObejct, sNode))
            {
                return RET_ERROR;
            }
            if (!jObejct.isArray())
            {
                cout<<"节点不是数组!\n";
                return RET_ERROR;
            }

             if (newObject.type() == Json::nullValue)
            {
                jObejct.append(strValue);
            }
            else 
            {
                jObejct.append(newObject);
            }
            obj = jObejct;
        }
    }
    for (size_t i=vecObject.size()-1; i>=0; i--)
    {
        if (vecObject.size() == 0)
        {
            break;
        }

        strNode = vecObject[i];
        //最后一条
        if (i == 0)
        {
            int nStart = strNode.find('[');
            int nEnd   = strNode.find(']');

            if (-1 != nStart && -1 != nEnd)
            {
                int nPos = -1;
                sscanf(strNode.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);
                if (!root.isArray())
                {
                    return RET_ERROR;
                }

                if (nPos < 0)
                {
                    int nSize = root.size();
                    //负数下标不能超过size大小
                    if (nPos*(-1) > nSize)
                    {
                        cout<<"节点下标越界!\n";
                        return RET_ERROR;
                    }
                    nPos = nPos % nSize;
                    if (nPos != 0)
                    {
                        nPos += nSize;
                    }
                }
                else if (nPos > root.size()-1)
                {
                    cout<<"节点下标越界!\n";
                    return RET_ERROR;
                }
                root[nPos] = obj;
            }
            else
            {
                root[strNode] = obj;
            }
            obj = root;
            break;
        }

        strPreNode = vecObject[i-1];
        Json::Value tempObject = root; 

        if (!GetJsonObject(tempObject, strPreNode))
        {
            return RET_ERROR;
        }  

        //获取Key
        if (strNode.substr(strPreNode.size(),1) == ".")
        {
            strKey = strNode.substr(strPreNode.size()+1);
        }  
        else
        {
            strKey = strNode.substr(strPreNode.size());
        }
        //key为数组下标
        int nStart = strKey.find('[');
        int nEnd   = strKey.find(']');

        if (-1 != nStart && -1 != nEnd)
        {
            int nPos = -1;
            sscanf(strKey.substr(nStart+1,nEnd-nStart-1).c_str(),"%d", &nPos);
            if (!tempObject.isArray())
            {
                return RET_ERROR;
            }
            if (nPos < 0)
            {
                int nSize = tempObject.size();
                //负数下标不能超过size大小
                if (nPos*(-1) > nSize)
                {
                    cout<<"节点下标越界!\n";
                    return RET_ERROR;
                }
                nPos = nPos % nSize;
                if (nPos != 0)
                {
                    nPos += nSize;
                }
            }
            else if (nPos >= tempObject.size())
            {
                cout<<"节点下标越界!\n";
                return RET_ERROR;
            }
            tempObject[nPos] = obj;
        }
        else
        {
            tempObject[strKey] = obj;
        }
        obj = tempObject;
    }
    root = obj;
    jsonObj = root.toStyledString();
    return RET_OK;
}


**************************************************************************************************

main.cpp

**************************************************************************************************

#include <iostream>
#include <string>
#include "JsonBase.h"
using namespace std;
int main()
{
    string strObject = "{\"a\":[\"1\",\"2\"]}";
    JsonBase json;

    //bool GetJsonObject(Json::Value &jsonObj, string strValue);
    vector<string> vec;
    json.GetJsonChildNodeArray(strObject,"",vec);
    for (int i=0;i<vec.size();i++)
    {
        cout<<vec[i]<<endl;
    }
    //int SetJsonObejct(string jsonObj, string strNode, string strValue);
    json.SetJsonObejct(strObject,"a[1]","\"0\"");
    cout<<strObject<<endl;
    
    //int GetJsonValue(string jsonObj,string strNode,string strOut);
    string strOut;
    json.GetJsonValue(strObject,"a[1]",strOut);
    cout<<strOut<<endl;
    //bool IsNodeExisted(string jsonObj, string strNode);
    cout<<json.IsNodeExisted(strObject,"a[1]")<<endl;
    cout<<json.IsNodeExisted(strObject,"a[2]")<<endl;
    //int AppendArrayObject(string jsonObj, string strNode, string strValue);
    json.AppendArrayObject(strObject,"a","\"3\"");
    json.GetJsonValue(strObject,"a",strOut);
    cout<<strOut<<endl;
    return 0;
}


转载源地址:http://blog.csdn.net/timothy721/article/details/19993495



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值