1. 程式人生 > >更輕的JSON

更輕的JSON

Problem description
JavaScript Object Notation——JSON,是一種輕量級的資料交換格式。為了簡便起見,我們使用一種更輕量級的JSON來傳遞資料。
更輕的JSON格式如下:{JSON項, JSON項,…,JSON項}。即:由花括號包圍的若干(可為0項)用逗號分隔的JSON項。
JSON項的格式如下:鍵:值。鍵與值均是用雙引號括起的非空字串,雙引號之間的全部內容即為鍵或值的內容,鍵、值用冒號分隔。
空格不影響JSON格式的判別。不允許出現具有相同鍵的JSON項。
Input
輸入有多個案例,每個案例的第一行是一個試圖表示“更輕的JSON”字串。第二行是一個代表鍵的字串(此字串不再有表包裹的雙引號,見樣例)。每行不超過100個字元(友情提示:在C語言中請用gets()讀取輸入)。
Output
對於每個案例,輸出一行。如果JSON格式錯誤,則輸出JSONERROR;如果JSON字串中沒有輸入所要查詢的鍵,則輸出KEYERROR;否則輸出鍵對應的值。
Sample Input
{"X":"1","Y":"2"}
X
Sample Output
1
Problem Source

HUNNU Contest 


#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;

map<string,string> p;

int main()
{
	//freopen("b.txt","r",stdin);
	string s,t;
	while(getline(cin,s))
	{
		int i,n,x=0;
		bool flag=true;
		p.clear();
		for(i=0;i<s.size();i++)  //預處理空格
		{
			if(s[i]=='"') x++;
			if(x%2==0&&s[i]==' ') s.erase(i,1),i--;
		}
		n=s.size();
		if(n<2||s[0]!='{'||s[n-1]!='}') flag=false;
		else if(n!=2) {
			s[0]=',';
			for(i=-1;i+1<n-1;)
			{
				string str="";
				if(s[++i]!=',') flag=false;
				else {
					if(s[++i]!='"') flag=false;
					else {
						while(s[++i]!='"'&&i<n-1) str+=s[i];
						if(i==n-1||str=="") flag=false;
					}
				}	
				if(!flag) break;
				string num="";
				if(s[++i]!=':') flag=false;
				else {
					if(s[++i]!='"') flag=false;
					else {
						while(s[++i]!='"'&&i<n-1) num+=s[i];
						if(i==n-1||num=="") flag=false;
					}
				}
				if(!flag) break;
				if(p.count(str)!=0) flag=false;
				else p[str]=num;
				if(!flag) break;
			}
		}
		getline(cin,t);
		if(flag) {
			if(p.count(t)==0) cout<<"KEYERROR"<<endl;
			else cout<<p[t]<<endl;
		}
		else cout<<"JSONERROR"<<endl;
	}
	return 0;
}