从JSon获取n个对象及其字段,然后将它们存储为类对象

时间:2019-01-18 15:14:43

标签: c++ json parsing rapidjson

我正在尝试从JSon文件中获取有关我的对象的信息。它包含n个对象(例如2个),每个对象4个字段。我通过Rapidjson解析.json,而我的IDE是Qt Creator。

我已经尝试使用http://rapidjson.org/md_doc_pointer.html#JsonPointer中描述的指针和基础教程中的查询对象,但是不知何故我无法使用它。

.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<> >*}'

另一种尝试是遍历Document中的对象:

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 :(得分:0)

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