Получение n объектов и их полей из JSon, затем сохранение их как объекта класса - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь получить информацию о моих объектах из файла JSon. Он содержит n объектов (например, 2) по 4 поля. Я разбираю .json по fastjson, и моя IDE - Qt Creator.

Я уже пытался использовать указатели, описанные в http://rapidjson.org/md_doc_pointer.html#JsonPointer и Query Objects из их основного учебника, но почему-то я не могу заставить его работать.

Вот как будет выглядеть пример файла .json.

{
"opiekun1" : {
    "imie": "Maksym",
    "nazwisko": "Zawrotny",
    "email": "maksym@wp.pl",
    "haslo": "herbatka"},
"opiekun2" : {
    "imie": "Filip",
    "nazwisko": "Szatkowski",
    "email": "filip@wp.pl",
    "haslo": "kawusia"}
}

Я получаю документ DOM по:

FILE* fp = fopen(json_filename.c_str(), "rb");
char readBuffer[65536];    
FileReadStream is(fp, readBuffer, sizeof(readBuffer));
Document d;
d.ParseStream(is);    

Я попробовал Pointer () так:

Value* value = Pointer("/opiekun1/imie").Get(parsedJSon);

но я получил:

invalid conversion from 'const rapidjson::GenericValue<rapidjson::UTF8<> >*' to 'rapidjson::Value* {aka rapidjson::GenericValue<rapidjson::UTF8<> >*}'

Еще одна попытка была перебрать объекты в документе:

for (auto& object : parsedJSon.GetObject())
{
    CUzytkownik* user;
    user = new CUzytkownik;
    int counter = 0;
    for (Value::ConstMemberIterator itr = object.MemberBegin();
         itr != object.MemberEnd(); itr++)
    {
        if (itr->name.GetString() == "imie")
            user->imie = itr->value.GetString();

    }
}

Но там написано:

const struct rapidjson::GenericMember<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<> >' has no member named 'MemberEnd'

Мне кажется, что я что-то неправильно понимаю при обработке объектов в файлах .json. Может ли кто-нибудь объяснить мне это и предоставить пример кода? Я бы хотел, чтобы мой вывод выглядел примерно так:

CUzytkownik* opiekun1 = new CUzytkownik;
opiekun1->name = "Maksym";
opiekun1->nazwisko = "Zawrotny";
opiekun1->email = "maksym@wp.pl";
opiekun1->haslo = "herbatka";

Если кто-то имеет опыт работы с rapidjson и хотел бы помочь, я буду очень признателен. Любые альтернативные примеры, такие как обработка массива или что-то подобное, также приветствуются.

Заранее спасибо!

1 Ответ

0 голосов
/ 20 января 2019

https://github.com/xyz347/x2struct может загрузить json в clsss или преобразовать класс в json.

код:

#include <iostream>
#include <map>

#include "x2struct/x2struct.hpp"

using namespace std;

struct Info {
    string imie;
    string nazwisko;
    string email;
    string haslo;
    XTOSTRUCT(O(imie, nazwisko, email, haslo));
};


int main(int argc, char *argv[]) {
    map<string, Info> m;
    x2struct::X::loadjson("a.json", m, true);
    for (map<string, Info>::const_iterator it=m.begin(); it!=m.end(); it++) {
        cout<<it->first<<endl;
        cout<<'\t'<<it->second.imie<<endl;
        cout<<'\t'<<it->second.nazwisko<<endl;
        cout<<'\t'<<it->second.email<<endl;
        cout<<'\t'<<it->second.haslo<<endl;
    }
}

вывод:

opiekun1
        Maksym
        Zawrotny
        maksym@wp.pl
        herbatka
opiekun2
        Filip
        Szatkowski
        filip@wp.pl
        kawusia
...