CCF計算機職業資格認證考試題解系列文章爲meelo原創,請務必以連接形式註明本文地址html
json是一個遞歸數據結構,所以可使用函數的遞歸調用來進行解析。ios
每一類數據對應一個解析函數,代碼中parseString實現解析字符串的功能,parseObject實現解析對象的功能。編程
解析函數的主體功能就是依次遍歷每個字符,根據字符判斷是不是字符串的開始、對象的開始……並進行相應的處理。json
json是一個鍵值對的結構,所以能夠用map存儲。map的鍵能夠用查詢的格式,用小數點.來分隔多層的鍵。數據結構
C++函數
#include <iostream> #include <cassert> #include <map> using namespace std; string parseString(string &str, int &i) { string tmp; if(str[i] == '"') i++; else assert(0); while(i < str.size()) { if(str[i] == '\\') { i++; tmp += str[i]; i++; } else if(str[i] == '"') { break; } else { tmp += str[i]; i++; } } if(str[i] == '"') i++; else assert(0); return tmp; } void parseObject(string &str, string prefix, map<string, string> &dict, int &i) { if(str[i] == '{') i++; else assert(0); string key, value; bool strType = false; // false:key, true:value while(i < str.size()) { if(str[i] == '"') { string tmp = parseString(str, i); if(strType) { // value value = tmp; //cout << key << " " << value << "\n"; dict[key] = value; } else { // key key = prefix + (prefix==""?"":".") + tmp; } } else if(str[i] == ':') { strType = true; i++; } else if(str[i] == ',') { strType = false; i++; } else if(str[i] == '{') { dict[key] = ""; parseObject(str, key, dict, i); } else if(str[i] == '}') { break; } else { i++; } } if(str[i] == '}') i++; else assert(0); } int main() { int N, M; cin >> N >> M; string json; if(cin.peek()=='\n') cin.ignore(); for(int n=0; n<N; n++) { string tmp; getline(cin, tmp); json += tmp; } map<string, string> dict; int i = 0; parseObject(json, "", dict, i); string query; for(int m=0; m<M; m++) { getline(cin, query); if(dict.find(query) == dict.end()) { cout << "NOTEXIST\n"; } else { if(dict[query] == "") { cout << "OBJECT\n"; } else { cout << "STRING " << dict[query] << "\n"; } } } }