#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
-------