• C++ json递归解析


    #include "rapidjson/document.h"
    #include "rapidjson/writer.h"
    #include "rapidjson/stringbuffer.h"
    #include "rapidjson/filereadstream.h"
    #include <iostream>
    #include <string>
    #include <map>
    #include <fstream>
    #include <rapidjson/istreamwrapper.h>
    using namespace rapidjson;
    using namespace std;
    Document doc;
    void JsonToMap(const Value &val);
    void stringToJsonObject(std::string filePath){
        ifstream ifs(filePath);
        IStreamWrapper is(ifs);
        
        doc.ParseStream(is);
        JsonToMap(doc);
    
    }
    //string key, value
    // 只有一个层级的
    //map<string,string>
    //map<string,bool>
    //map<string,int>
    //map<string,vector<student>>
    //map<string,student>
    //map<string,map<int type,student>>
    //map<string,map<int type,int>>
    //map<string,map<int type,vector<int>>>
    
    map<string,string>ms;
    map<string,int>mi;
    map<string,bool>mb;
    
    template<typename T>
    map<string,T>mt;
    
    bool getBasicVal(const string &str,const Value &val){
        if(val.IsBool()){
            mb[str]=val.GetBool();
            return true;
        }else if(val.IsInt()){
            mi[str]=val.GetInt();
            return true;
        }else if(val.IsString()){
            ms[str]=val.GetString();
            return true;
        }
        return false;
    }
    
    void JsonToMap(const Value &val){
        for(auto &m : val.GetObject()){
            if(strcmp(m.name.GetString(),"services") == 0){
                cout<<" parse customize type"<<endl;
    
            }else if(getBasicVal(m.name.GetString(),val[m.name.GetString()])){
    
            }else if(val[m.name.GetString()].IsArray()){
                const Value &arr = val[m.name.GetString()];
                for(rapidjson::SizeType i=0; i<arr.Size(); i++ ){
                    JsonToMap(arr[i]);
                }
            }
            else if(val[m.name.GetString()].IsObject()){
                JsonToMap(val[m.name.GetString()]);
            }
        }
    }
    template <typename map>
    void printMap(map m){
        for(auto iter = m.begin(); iter != m.end(); ++iter){
            cout<<iter->first<<"="<<iter->second<<endl;
        }
    }
    int main() {
        // 1. 把 JSON 解析至 DOM。
        string filePath = "/home/ygy/work/gos/src/ara/utils/tests/dds.json";
        stringToJsonObject(filePath);
    
        printMap(ms);
        cout<<"-------\n";
        printMap(mi);
        cout<<"-------\n";
        printMap(mb);
        cout<<"-------\n";
        return 0;
    
    }

    如果是自定义类型,需要自定义解析结构体。

    如果是想加字段,字段的位置可以是任何位置的key和value。

    只要key不和之前的重名。

    那么保存到map中的数据就是唯一的。

    {
      "applicationName": "/huawei/ap/SwComponent/dds_event_sync_client_sample/DdsEventSyncClientSampleProcess",
      "object1":{
        "serviceId": 101,
        "serviceId1": 101,
        "protocolIdUsed": false
      },
      "fields":    {"serviceId2": 101,
        "serviceId13": 101,
        "protocolIdUsed1": false},
        "events": [
          {
            "event": "CameraImageEvent",
            "id": 19958,
            "isDpRawData": false,
            "dataType": "/huawei/ap/EventDataType/CameraImage/EventSyncImage",
            "topicName": "cameraImageEvent"
          }
        
      ],
      "services": [
        {
          "service": "/huawei/ap/ServiceInterface/DdsEventSyncSample",
          "serviceId": 101,
          "serviceId1": 101,
          "protocolIdUsed": false,
          "new" :1,
          "events": [
            {
              "event": "CameraImageEvent",
              "id": 19958,
              "isDpRawData": false,
              "dataType": "/huawei/ap/EventDataType/CameraImage/EventSyncImage",
              "topicName": "cameraImageEvent"
            }
          ],
          "fields": [   {"serviceId2": 101,
            "serviceId13": 101,
            "protocolIdUsed1": false}],
          "methods": [],
          "instances": [
            {
              "shortName": "/huawei/ap/Service/instance/DdsEventSyncClientInstance",
              "instance": "1",
              "domainId": 0,
              "network": "192.168.10.6",
              "isClient": true,
              "fastSerialize": true,
              "qosProfile": "/var/domainqos.xml",
              "majorVersion": 12,
              "minVersion": 56,
              "events": [
                {
                  "id": 19958,
                  "qosProfile": "/var/eventsqos.xml"
                }
              ],
              "fields": [],
              "methods": []
            }
          ]
        }
      ]
    }
    ygy@ygy-VirtualBox:~/work/gos/build$ ./bin/json_test_test 
     parse customize type
    applicationName=/huawei/ap/SwComponent/dds_event_sync_client_sample/DdsEventSyncClientSampleProcess
    dataType=/huawei/ap/EventDataType/CameraImage/EventSyncImage
    event=CameraImageEvent
    topicName=cameraImageEvent
    -------
    id=19958
    serviceId=101
    serviceId1=101
    serviceId13=101
    serviceId2=101
    -------
    isDpRawData=0
    protocolIdUsed=0
    protocolIdUsed1=0
    -------

    http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html 

  • 相关阅读:
    python版本升级及pip部署方法
    Redis集群管理(二)
    UP UP UP!(dp)
    One Way Roads(搜索)
    Back to Underworld(搜索)
    队列链表实现以及有序表的合并
    第八届郑州轻工业学院ACM(程序设计大赛)校内预选赛
    Modulo Sum(背包 + STL)
    Co-prime Array&&Seating On Bus(两道水题)
    Hard Process(二分)
  • 原文地址:https://www.cnblogs.com/yuguangyuan/p/16145049.html
Copyright © 2020-2023  润新知