анализ данных JSON и получение схемы одной записи из данных - PullRequest
0 голосов
/ 06 мая 2019

У меня есть образец JSON

{
    "id": 1,
    "type": "deemed",
    "University": {
        "student": [{
                "id": 10,
                "name": "abc"
            },
            {
                "id": 20,
                "name": "def"
            }
        ]
    },
    "year": 2019
}

Я пытаюсь проанализировать эти данные json с помощью rapidjson и хочу узнать схему json одной записи. Я могу получить ключи и типы каждого значения JSON. Теперь я хочу поддерживать иерархии, поддерживающие отношения между родителями и детьми.

Здесь я должен разобраться с двумя вещами:
1. Тип каждой клавиши - это сделано 2. Если тип ключа - массив / объект, то сколько дочерних записей присутствует и есть типы.
Это все, что я пытаюсь сделать для одной полной записи JSON. Любые предложения ??

Мой код для поиска типа каждой клавиши с помощью quickjson выглядит следующим образом .. Подход: я поддерживаю очередь для хранения каждого значения ключа и на основе событий, генерируемых rapidjson, я обновляю тип каждого ключа.

Узел моей очереди: Класс Node {

public:
    string key;
    string type;
    Node* next;

};

Мой обработчик:

struct MyHandler: общедоступный BaseReaderHandler, MyHandler> {

bool StartObject(){

    //cout<<"StartObject()"<<endl;

    if(q->rear!=NULL){

        if(q->rear->type== "")
            q->rear->type = "object";
    }
    return true;

}
bool Key(const char* str, SizeType length, bool copy){
    string n = string(str,length);
    enqueue(q,n);
    //cout<<"Key :" << str << endl;
    return true;
}

bool Uint(unsigned u){

    if(q->rear->type== ""){
        q->rear->type = "integer";
    }
    return true;
}

bool String(const char* str, SizeType length, bool copy){

    if(q->rear->type == ""){

    q->rear->type = "string";

    }
    return true;
}
bool StartArray(){
    //cout<<"Startarray()"<<endl;

    if(q->rear->type==""){
      q->rear->type = "array";

    }
    return true;

}
 bool EndObject(SizeType memberCount) { 
    //cout << "EndObject:   " << memberCount<<endl;
    return true; 
 }
 bool EndArray(SizeType elementCount) { 
// cout << "EndArray:  " <<elementCount<< endl;
 return true;
 }
* *} Тысяча двадцать-одина; * * тысяча двадцать две

Myoutput:

Идентификатор: целое число Тип: строка Университет: объект студент: массив ID: целое число, Имя: строка ID: целое число, Имя: строка год: целое число

...