1. 程式人生 > >rapidjson對於json的序列化與反序列化

rapidjson對於json的序列化與反序列化

ica reg int arp 版權 carp 車輛 tint 生成

轉載:

https://blog.csdn.net/qq849635649/article/details/52678822

#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
#include <iostream>
#include <string>
 
using namespace std;
 
void Serialize_1()
{
    rapidjson::StringBuffer strBuf;
    rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
 
    writer.StartObject();
 
    //1. 整數類型
    writer.Key("Int");
    writer.Int(1);
 
    //2. 浮點類型
    writer.Key("Double");
    writer.Double(12.0000001);
 
    //3. 字符串類型
    writer.Key("String");
    writer.String("This is a string");
 
    //4. 結構體類型
    writer.Key("Object");
    writer.StartObject();
    writer.Key("name");
    writer.String("qq849635649");
    writer.Key("age");
    writer.Int(25);
    writer.EndObject();
 
    //5. 數組類型
    //5.1 整型數組
    writer.Key("IntArray");
    writer.StartArray();
    //順序寫入即可
    writer.Int(10);
    writer.Int(20);
    writer.Int(30);
    writer.EndArray();
 
    //5.2 浮點型數組
    writer.Key("DoubleArray");
    writer.StartArray();
    for(int i = 1; i < 4; i++)
    {
        writer.Double(i * 1.0);
    }
    writer.EndArray();
 
    //5.3 字符串數組
    writer.Key("StringArray");
    writer.StartArray();
    writer.String("one");
    writer.String("two");
    writer.String("three");
    writer.EndArray();
 
    //5.4 混合型數組
    //這說明了,一個json數組內容是不限制類型的
    writer.Key("MixedArray");
    writer.StartArray();
    writer.String("one");
    writer.Int(50);
    writer.Bool(false);
    writer.Double(12.005);
    writer.EndArray();
 
    //5.5 結構體數組
    writer.Key("People");
    writer.StartArray();
    for(int i = 0; i < 3; i++)
    {
        writer.StartObject();
        writer.Key("name");
        writer.String("qq849635649");
        writer.Key("age");
        writer.Int(i * 10);
        writer.Key("sex");
        writer.Bool((i % 2) == 0);
        writer.EndObject();
    }
    writer.EndArray();
 
    writer.EndObject();
 
    string data = strBuf.GetString();
    cout << data << endl;
}
--------------------- 
作者:奮鬥-少年 
來源:CSDN 
原文:https://blog.csdn.net/qq849635649/article/details/52678822 
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

解析:

void parse() {
    //創建解析對象
    rapidjson::Document doc;
    //首先進行解析,沒有解析錯誤才能進行具體字段的解析
    if(!doc.Parse(data.data()).HasParseError())
    {
        //1. 解析整數
        if(doc.HasMember("Int") && doc["Int"].IsInt())
        {
            cout << "Int = " << doc["Int"].GetInt() << endl;
        }
        //2. 解析浮點型
        if(doc.HasMember("Double") && doc["Double"].IsDouble())
        {
            cout << "Double = " << doc["Double"].GetDouble() << endl;
        }
        //3. 解析字符串
        if(doc.HasMember("String") && doc["String"].IsString())
        {
            cout << "String = " << doc["String"].GetString() << endl;
        }
        //4. 解析結構體
        if(doc.HasMember("Object") && doc["Object"].IsObject())
        {
            const rapidjson::Value& object = doc["Object"];
            if(object.HasMember("name") && object["name"].IsString())
            {
                cout << "Object.name = " << object["name"].GetString() << endl;
            }
            if(object.HasMember("age") && object["age"].IsInt())
            {
                cout << "Object.age = " << object["age"].GetInt() << endl;
            }
        }
        //5. 解析數組類型
        //5.1 整型數組類型
        if(doc.HasMember("IntArray") && doc["IntArray"].IsArray())
        {
            //5.1.1 將字段轉換成為rapidjson::Value類型
            const rapidjson::Value& array = doc["IntArray"];
            //5.1.2 獲取數組長度
            size_t len = array.Size();
            //5.1.3 根據下標遍歷,註意將元素轉換為相應類型,即需要調用GetInt()
            for(size_t i = 0; i < len; i++)
            {
                cout << "IntArray[" << i << "] = " << array[i].GetInt() << endl;
            }
        }
        //5.2 浮點型數組類型
        if(doc.HasMember("DoubleArray") && doc["DoubleArray"].IsArray())
        {
            const rapidjson::Value& array = doc["DoubleArray"];
            size_t len = array.Size();
            for(size_t i = 0; i < len; i++)
            {
                //為防止類型不匹配,一般會添加類型校驗
                if(array[i].IsDouble())
                {
                    cout << "DoubleArray[" << i << "] = " << array[i].GetDouble() << endl;
                }
            }
        }
        //5.3 字符串數組類型
        if(doc.HasMember("StringArray") && doc["StringArray"].IsArray())
        {
            const rapidjson::Value& array = doc["StringArray"];
            size_t len = array.Size();
            for(size_t i = 0; i < len; i++)
            {
                //為防止類型不匹配,一般會添加類型校驗
                if(array[i].IsString())
                {
                    cout << "StringArray[" << i << "] = " << array[i].GetString() << endl;
                }
            }
        }
        //5.4 混合型
        if(doc.HasMember("MixedArray") && doc["MixedArray"].IsArray())
        {
            const rapidjson::Value& array = doc["MixedArray"];
            size_t len = array.Size();
            for(size_t i = 0; i < len; i++)
            {
                //為防止類型不匹配,一般會添加類型校驗
                if(array[i].IsString())
                {
                    cout << "MixedArray[" << i << "] = " << array[i].GetString() << endl;
                }
                else if(array[i].IsBool())
                {
                    cout << "MixedArray[" << i << "] = " << array[i].GetBool() << endl;
                }
                else if(array[i].IsInt())
                {
                    cout << "MixedArray[" << i << "] = " << array[i].GetInt() << endl;
                }
                else if(array[i].IsDouble())
                {
                    cout << "MixedArray[" << i << "] = " << array[i].GetDouble() << endl;
                }
            }
        }
        //5.5 結構體數組類型
        if(doc.HasMember("People") && doc["People"].IsArray())
        {
            const rapidjson::Value& array = doc["People"];
            size_t len = array.Size();
            for(size_t i = 0; i < len; i++)
            {
                const rapidjson::Value& object = array[i];
                //為防止類型不匹配,一般會添加類型校驗
                if(object.IsObject())
                {
                    cout << "ObjectArray[" << i << "]: ";
                    if(object.HasMember("name") && object["name"].IsString())
                    {
                        cout << "name=" << object["name"].GetString();
                    }
                    if(object.HasMember("age") && object["age"].IsInt())
                    {
                        cout << ", age=" << object["age"].GetInt();
                    }
                    if(object.HasMember("sex") && object["sex"].IsBool())
                    {
                        cout << ", sex="  << (object["sex"].GetBool() ? "男" : "女") << endl;
                    }
                }
            }
        }
    }
    /**
     *    最後註意:因為rapidjson不會做安全校驗,所以要自己做安全校驗,以int整型為例
     * “if(object.HasMember("age") && object["age"].IsInt()) {}”
     * 這句校驗很重要,既要校驗有該子段,也要校驗類型正確,否則會引發程序崩潰
     */
}
--------------------- 
作者:奮鬥-少年 
來源:CSDN 
原文:https://blog.csdn.net/qq849635649/article/details/52678822 
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

順便貼一下我自己的使用:

int Alg_VIR_application::saveAdnTransWhiteBoxTestInfo(sApplicationInput &applicationInput, sWhiteBoxTestInfo &whiteBoxTestInfo, std::string jsonTestInfo)
{
#ifdef SAVE_WHITE_BOX_TEST_INFO
    if (!applicationInput.paramWhiteBoxTestOpenFlag)
        return PROCESS_SUCCESS;
    std::vector<cv::Point> vecPtShift = applicationInput.vecPtShift;
    //將公共的信息從applicationInput中獲取並塞入至whiteBoxTestInfo中
    whiteBoxTestInfo.recPlateNum = applicationInput.regPlateNum;
    whiteBoxTestInfo.objLocation = applicationInput.car_location_res.objLocation;
    whiteBoxTestInfo.vvPoliceManDetectionOutput = applicationInput.vvPoliceManDetectionOutput;
    int CountobjLoc = MIN(whiteBoxTestInfo.objLocation.size(), vecPtShift.size());
    int CountPoliceManDetection = MIN(whiteBoxTestInfo.vvPoliceManDetectionOutput.size(), vecPtShift.size());
    int CountTrifficLight = MIN(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects.size(), vecPtShift.size());
    //與違法類型相關的信息,在前面進行app內進行處理的時候已經塞值進去了,因此現在whiteBoxTestInfo中已經是全的值,可以進行json的轉換了
    rapidjson::StringBuffer strBuf;
    rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
    writer.StartObject();
    //4. 結構體類型
    writer.Key("recPlateNum");
    writer.String(whiteBoxTestInfo.recPlateNum.c_str());
    //5.5 結構體數組,寫目標車輛的位置
    writer.Key("vvObjectLoc");
    writer.StartObject();
    for(int j = 0; j < CountobjLoc; j++)
    {
        writer.Key(("objectLocation" + std::to_string(j)).c_str());
        writer.StartArray();
        writer.Int(whiteBoxTestInfo.objLocation[j].x + vecPtShift[j].x);
        writer.Int(whiteBoxTestInfo.objLocation[j].y + vecPtShift[j].y);
        writer.Int(whiteBoxTestInfo.objLocation[j].width);
        writer.Int(whiteBoxTestInfo.objLocation[j].height);
        writer.EndArray();
    }
    writer.EndObject();
    //5.5 結構體數組,寫交警的位置
    writer.Key("vvPoliceManDetectionOutput");
    writer.StartObject();
    for(int i = 0; i < CountPoliceManDetection; i++)
    {
        writer.Key(("PoliceManDetection" + std::to_string(i)).c_str());
        writer.StartArray();
        for(int j = 0; j < whiteBoxTestInfo.vvPoliceManDetectionOutput[i].size(); j++)
        {
            if ( whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].policeStatus == PCLPolice)
            {
                writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.x + vecPtShift[i].x);
                writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.y + vecPtShift[i].y);
                writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.width);
                writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.height);
            }
        }
        writer.EndArray();
    }
    writer.EndObject();
    //寫紅綠燈返回的結構體
    writer.Key("sARLTestInfo");
    writer.StartObject();
        {
            writer.Key("SingleTrifficLightState");
            writer.StartObject();
            if (whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects.size() > 0)
            {
                for(int i = 0; i < CountTrifficLight; i++)
                {
                    writer.Key(("SingleTrifficLightState" + std::to_string(i)).c_str());
                    writer.StartArray();
                    for(int j = 0; j < whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i].size(); j++)
                    {
                        writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.x + vecPtShift[i].x);
                        writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.y + vecPtShift[i].y);
                        writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.width);
                        writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.height);
                        writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightClass);
                    }
                    writer.EndArray();
                }
            }
            writer.EndObject();
            {
                writer.Key("WholeTrifficLightState");
                writer.StartArray();
                writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.trafficLightState.sLeftState);
                writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.trafficLightState.sStraightState);
                writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.trafficLightState.sRightState);
                writer.EndArray();
            }
        }
        writer.Key("LaneDircetion");
        writer.Int(whiteBoxTestInfo.ARLTestInfo.LaneDircetion);
        writer.Key("CarDirection");
        writer.Int(whiteBoxTestInfo.ARLTestInfo.CarDirection);
    writer.EndObject();
    //寫逆行返回的結構體
    writer.Key("sRRTestInfo");
    writer.StartObject();
        writer.Key("LaneDircetion");
        writer.Int(whiteBoxTestInfo.RRTestInfo.LaneDircetion);
        writer.Key("CarPose");
        writer.Int(whiteBoxTestInfo.RRTestInfo.CarPose);
        writer.Key("CarDirection");
        writer.Int(whiteBoxTestInfo.RRTestInfo.CarDirection);
        writer.Key("reverseLaneProportion");
        writer.Double(whiteBoxTestInfo.RRTestInfo.reverseLaneProportion);
        writer.Key("overStopLineProportion");
        writer.Double(whiteBoxTestInfo.RRTestInfo.overStopLineProportion);
    writer.EndObject();
    //寫違反導向返回的結構體
    writer.Key("sADTestInfo");
    writer.StartObject();
        writer.Key("LaneDircetion");
        writer.Int(whiteBoxTestInfo.RRTestInfo.LaneDircetion);
        writer.Key("CarPose");
        writer.Int(whiteBoxTestInfo.RRTestInfo.CarPose);
    writer.EndObject();
    //寫壓線返回的結構體
    writer.Key("sCLALTestInfo");
    writer.StartObject();
        writer.Key("CarBodyRate");
        writer.Double(whiteBoxTestInfo.CLALTestInfo.CarBodyRate);
    writer.EndObject();


    writer.EndObject();
    string json = strBuf.GetString();


    std::ofstream fout;
    std::string root_path = "/media/tmp/test/";
    fout.open(root_path + "11111.json");
    fout << json << std::endl;
    fout.close();


#endif
}

生成的json如下:

{
    "recPlateNum":"浙G7FQ66",
    "vvObjectLoc":{
        "objectLocation0":[
            362,
            641,
            272,
            252
        ],
        "objectLocation1":[
            2178,
            475,
            158,
            152
        ],
        "objectLocation2":[
            146,
            1340,
            185,
            73
        ]
    },
    "vvPoliceManDetectionOutput":{
        "PoliceManDetection0":[
            1114,
            148,
            18,
            42,
            1156,
            148,
            17,
            40
        ],
        "PoliceManDetection1":[
            2813,
            148,
            17,
            41,
            2716,
            139,
            23,
            34,
            2850,
            154,
            19,
            41
        ],
        "PoliceManDetection2":[
            1119,
            1185,
            18,
            38,
            1188,
            1201,
            19,
            38
        ]
    },
    "sARLTestInfo":{
        "SingleTrifficLightState":{
            "SingleTrifficLightState0":[
                633,
                22,
                38,
                11,
                2,
                600,
                22,
                32,
                12,
                3
            ],
            "SingleTrifficLightState1":[
                2329,
                22,
                37,
                12,
                2,
                2296,
                21,
                29,
                13,
                3
            ],
            "SingleTrifficLightState2":[
                633,
                1057,
                38,
                12,
                2,
                598,
                1057,
                33,
                13,
                3
            ]
        },
        "WholeTrifficLightState":[
            1,
            1,
            3
        ],
        "LaneDircetion":99,
        "CarDirection":3
    },
    "sRRTestInfo":{
        "LaneDircetion":99,
        "CarPose":99,
        "CarDirection":9,
        "reverseLaneProportion":0,
        "overStopLineProportion":0
    },
    "sADTestInfo":{
        "LaneDircetion":99,
        "CarPose":99
    },
    "sCLALTestInfo":{
        "CarBodyRate":0
    }
}

rapidjson對於json的序列化與反序列化