QT c++ katalog z plikami do json

0

Poniższa funkcja/metoda konwertuje strukturę katalogów do formatu json w głąb drzewa

QJsonArray filesOperations::listDirToJSON(QString dirLoc, QJsonArray tempJSON){//można skasowac tempJOSON !!!
    QDir sourceDir(dirLoc);
    QFileInfoList fileInfoList = sourceDir.entryInfoList();
    foreach(QFileInfo fileInfo, fileInfoList){
        if(fileInfo.isFile() && fileInfo.baseName() != ""){

            jSonTreeDirOb["type"]="file";
            jSonTreeDirOb["suffix"]=fileInfo.completeSuffix();
            jSonTreeDirOb["name"]=fileInfo.baseName();
            jSonTreeDirOb["path"]=fileInfo.path();
            if(fileInfo.completeSuffix()== "png"){//Sprawdza czy to plik graficzny
                jSonTreeDirOb["data"]=filesOperations::loadFileToImg(fileInfo.path(),fileInfo.baseName(),fileInfo.completeSuffix());
            }else{
                jSonTreeDirOb["data"]=filesOperations::base64_encode(filesOperations::loadFileToText(fileInfo.path(),fileInfo.baseName(),fileInfo.completeSuffix()));
            }
            tempJSON.append(jSonTreeDirOb);
        }
        if (fileInfo.isDir() && fileInfo.baseName() != ""){
            jSonTreeDirOb["type"]="catalog";
            jSonTreeDirOb["suffix"]=fileInfo.completeSuffix();
            jSonTreeDirOb["name"]=fileInfo.baseName();
            jSonTreeDirOb["path"]=fileInfo.path();

            tempJSON.append(jSonTreeDirOb);
            tempJSON.append(filesOperations::listDirToJSON(dirLoc+"/"+fileInfo.baseName()));
        }
    }
    return tempJSON;
}
 

otrzymuję coś takiego:

 [
    {
        "data": "I21lbnVBIHtiYWNrZ3JvdW5kLWvbG9yOiN...lMDUyMmZ9",
        "name": "css",
        "path": "tiles/menuA",
        "suffix": "css",
        "type": "file"
    },
    {
        "data": "NQ==",
        "name": "dataCol",
        "path": "tiles/menuA",
        "suffix": "txt",
        "type": "file"
    },
    {
        "data": "MQ==",
        "name": "dataRow",
        "path": "tiles/menuA",
        "suffix": "txt",
        "type": "file"
    },
    {
        "data": "Mg==",
        "name": "dataSizeX",
        "path": "tiles/menuA",
        "suffix": "txt",
        "type": "file"
    },
    {
        "data": "Mg==",
        "name": "dataSizeY",
        "path": "tiles/menuA",
        "suffix": "txt",
        "type": "file"
    },
    {
        "data": "Mg==",
        "name": "files",
        "path": "tiles/menuA",
        "suffix": "",
        "type": "catalog"
    },
    [
        {
            "data": "Mg==",
            "name": "img_01",
            "path": "tiles/menuA/files",
            "suffix": "",
            "type": "catalog"
        },
        [
            {
                "data": "iVBORw0KGgoAAAANSUhEU...==",
                "name": "dataBase64",
                "path": "tiles/menuA/files/img_01",
                "suffix": "png",
                "type": "file"
            },
            {
                "data": "cG5n",
                "name": "type",
                "path": "tiles/menuA/files/img_01",
                "suffix": "txt",
                "type": "file"
            },
            {
                "data": "ZGF0YTppbWFnZS9wbmc7Ym...FzZTY0L==",
                "name": "urlPrefix",
                "path": "tiles/menuA/files/img_01",
                "suffix": "txt",
                "type": "file"
            }
        ]
    ],
    {
        "data": "PGI+TUVOVSBBPC9iPiA8aW1nIGlkPSJtZW51QWltZ18...wMIvPg==",
        "name": "html",
        "path": "tiles/menuA",
        "suffix": "htm",
        "type": "file"
    },
    {
        "data": "bWVudUE=",
        "name": "id",
        "path": "tiles/menuA",
        "suffix": "txt",
        "type": "file"
    },
    {
        "data": "",
        "name": "js",
        "path": "tiles/menuA",
        "suffix": "js",
        "type": "file"
    }
]

Chciałbym aby w obiekcie katalog była umieszczona tablica obiektów (plików i katalogów (jeżeli istnieją)), a nie jak teraz jest pod sobą.(kod powyżej)
(Poniżej) przykład prawidłowy.

{
        "data": "Mg==",
        "name": "files",
        "path": "tiles/menuA",
        "suffix": "",
        "type": "catalog",
        "children": [
           {
               "data": "Mg==",
               "name": "img_01",
               "path": "tiles/menuA/files",
               "suffix": "",
               "type": "catalog"
           }....
       ]
    },
    

Prawdopodobnie problem leży w tym kodzie:

   if (fileInfo.isDir() && fileInfo.baseName() != ""){
            jSonTreeDirOb["type"]="catalog";
            jSonTreeDirOb["suffix"]=fileInfo.completeSuffix();
            jSonTreeDirOb["name"]=fileInfo.baseName();
            jSonTreeDirOb["path"]=fileInfo.path();

            tempJSON.append(jSonTreeDirOb);
            tempJSON.append(filesOperations::listDirToJSON(dirLoc+"/"+fileInfo.baseName()));
        }

obiekty w głąb drzewa katalogu powinny sie znajdować w tablicy obiektu który jest katalogiem >>> "children": [ <<<

Jak to zrobić ?

1
            tempJSON.append(jSonTreeDirOb);
            tempJSON.append(filesOperations::listDirToJSON(dirLoc+"/"+fileInfo.baseName()));

Nie wgryzam się aż tak bardzo w kod, ale spodziewałbym się czegoś w stylu:

jSonTreeDirOb["children"] = filesOperations::listDirToJSON(dirLoc+"/"+fileInfo.baseName());
tempJSON.append(jSonTreeDirOb);
0

Próbowałem własnie tak zrobić , program się uruchamia nie wywala błędu ale też nic się nie dzieje z tą metodą (tak jakby nie działała) (albo coś się wiesza ale nie widzę tego)

1

Debugger w rękę i do dzieła. Prześledź co się dzieje.

0

Błędów nie ma , ale z tego co zaobserwowałem to się coś zapętla i nie wychodzi z tej funkcji(metody w powyższym układzie) z

jSonTreeDirOb["children"] = filesOperations::listDirToJSON(dirLoc+"/"+fileInfo.baseName());
tempJSON.append(jSonTreeDirOb); 

program uruchamiam na release (na debug funkcja/metoda) nie startuje //brak błędów (wywołanie metody działa, brak komunikatów(qDebug()) z wewnątrz)

funkcja się nie zapętla, prawdopodobnie problem jest w klasie nadrzędnej...(być może nie da się sparsować tej tablicy do json), przeanalizuję tą klasę...

0

Jednak jest jakieś zapętlenie bo plik tekstowy zajmuje 7,4 MB danych a powinien z 2 - 3 KB :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1