CSP JSON 查詢

問題描述

  • JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式,能夠用來描述半結構化的數據。JSON 格式中的基本單元是值 (value),出於簡化的目的本題只涉及 2 種類型的值:
    • 字符串 (string):
      • 字符串是由雙引號"括起來的一組字符(能夠爲空)。
      • 若是字符串的內容中出現雙引號 ",在雙引號前面加反斜槓,也就是用 " 表示;
      • 若是出現反斜槓 ,則用兩個反斜槓 \\ 表示。
      • 反斜槓後面不能出現 " 和  之外的字符。例如:""、"hello"、""\\"。
    • 對象 (object):
      • 對象是一組鍵值對的無序集合(能夠爲空)。
      • 鍵值對錶示對象的屬性,鍵是屬性名,值是屬性的內容。
      • 對象以左花括號{開始,右花括號}結束,鍵值對之間以逗號,分隔。
      • 一個鍵值對的鍵和值之間以冒號 : 分隔。
      • 鍵必須是字符串,同一個對象全部鍵值對的鍵必須兩兩都不相同;
      • 值能夠是字符串,也能夠是另外一個對象。例如:{}、{"foo": "bar"}、{"Mon": "weekday", "Tue": "weekday", "Sun": "weekend"}。
  • 除了字符串內部的位置,其餘位置均可以插入一個或多個空格使得 JSON 的呈現更加美觀,也能夠在一些地方換行,不會影響所表示的數據內容。
  • 例如,上面舉例的最後一個 JSON 數據也能夠寫成以下形式。
      {
      "Mon": "weekday",
      "Tue": "weekday",
      "Sun": "weekend"
      }
  • 給出一個 JSON 格式描述的數據,以及若干查詢,編程返回這些查詢的結果。c++

    輸入格式

  • 第一行是兩個正整數 n 和 m,分別表示 JSON 數據的行數和查詢的個數。
  • 接下來 n 行,描述一個 JSON 數據,保證輸入是一個合法的 JSON 對象。
  • 接下來 m 行,每行描述一個查詢。給出要查詢的屬性名,要求返回對應屬性的內容。須要支持多層查詢,各層的屬性名之間用小數點 . 鏈接。保證查詢的格式都是合法的。編程

    輸出格式

  • 對於輸入的每個查詢,按順序輸出查詢結果,每一個結果佔一行。
  • 若是查詢結果是一個字符串,則輸出 STRING ,其中 是字符串的值,中間用一個空格分隔。
  • 若是查詢結果是一個對象,則輸出 OBJECT,不須要輸出對象的內容。
    若是查詢結果不存在,則輸出 NOTEXIST。app

    樣例輸入

    10 5
    {
    "firstName": "John",
    "lastName": "Smith",
    "address": {
    "streetAddress": "2ndStreet",
    "city": "NewYork",
    "state": "NY"
    },
    "esc\\aped": ""hello""
    }
    firstName
    address
    address.city
    address.postal
    esc\aped函數

    樣例輸出

    STRING John
    OBJECT
    STRING NewYork
    NOTEXIST
    STRING "hello"post

    評測用例規模與約定

  • n ≤ 100,每行不超過 80 個字符。
  • m ≤ 100,每一個查詢的長度不超過 80 個字符。
  • 字符串中的字符均爲 ASCII 碼 33-126 的可打印字符,不會出現空格。全部字符串都不是空串。
  • 全部做爲鍵的字符串不會包含小數點 .。查詢時鍵的大小寫敏感。
  •   50%的評測用例輸入的對象只有 1 層結構,80%的評測用例輸入的對象結構層數不超過 2 層。舉例來講,{"a": "b"} 是一層結構的對象,{"a": {"b": "c"}} 是二層結構的對象,以此類推。spa

分析:

  • 目標就是處理特定格式的字符串,主要任務是提取指定格式的字符串,並按照規則組織起來
  • 編寫函數處理雙引號包括的內容
  • 先處理屬性,而後找值:若是值是字符串直接處理,若是值是Object 遞歸調用本函數
  • 查詢包括嵌套查詢
  • 注意處理邊界信息,不要使編寫的遞歸函數只能處理兩層嵌套
#include <bits/stdc++.h>
using namespace std;
int n,m,num,i;
string tot,x;
string ql[100];
string str1,str2;
char str[10000];
map<string,string>mp;
void input()
{
    cin>>n>>m;
    getchar();
    tot="";num=0;
    for(int i=0;i<n;i++)
    {
        getline(cin,x);
        tot.append(x);
    }

    for(int i=0;i<m;i++){
        getline(cin,ql[i]);
    }
    int i=0;
    while(tot[i]==' ') i++;
    for(;i<tot.size();i++){
        while(tot[i]==' ') i++;
        str[num++]=tot[i];
    }

}

string find()
{
    i++;
    string tar;
    while(str[i]!='\"'){
        if(str[i]!='\\'){
            tar+=str[i];
            i++;
        }else {
            tar+=str[i+1];
            i+=2;
        }
    }
    i++;
    //cout<<tar<<endl;
    return tar;
}

void solve(string head)
{
    for(;i<num;i++)
    {
        if(str[i]=='\"') {
            str1 = find();
            if(head!="") str1 = head+'.'+str1;
            i++;
            if(str[i]=='\"'){
                str2 = find();
                //cout<<str1<<" "<<str2<<endl;
                mp[str1]=str2;
            }else {
                mp[str1]="####";
                solve(str1);
            }

        }
        if(str[i]=='}'){i++;return;}
    }


}
int main()
{
    i=0;
    input();
    //cout<<str<<endl;
    solve("");

    for(int i=0;i<m;i++)
    {
        //cout<<mp[ql[i]]<<endl;
        if(!mp.count(ql[i])){
            cout<<"NOTEXIST"<<endl;
            //cout<<"STRING "<<mp[ql[i]]<<endl;
        }else {
            if(mp[ql[i]]=="####")cout<<"OBJECT"<<endl;
            else cout<<"STRING "<<mp[ql[i]]<<endl;
        }

    }
    return 0;


}
相關文章
相關標籤/搜索