c++jsonqtqjsonobjectqjsondocument

Write in JSON file - Data not inserted in the correct order


I am creating a desktop app using QT C++ that take a text file and convert it to JSON File like this example:

{
    "102": {
        "NEUTRAL": {
            "blend": "100"
        },
        "AE": {
            "blend": "100"
        }
    },
    "105": {
        "AE": {
            "blend": "100"
        },
        "NEUTRAL": {
            "blend": "100"
        }
    }
}

This is the code I am using:

for (int i = 0; i < output_list1.size(); i++) {
        
        if (output_list1[i] == "-") {
            c_frame++;
            continue;
        }
        
        if (output_list1[i] != "NEUTRAL") {
            
            QJsonObject neutralBlendObject;
            neutralBlendObject.insert("blend", "100");
            QJsonObject phonemeObject;
            
            phonemeObject.insert("NEUTRAL", neutralBlendObject);
            QJsonObject keyBlendObject;
            keyBlendObject.insert("blend", output_list1[i].split(' ')[1]);
            

            phonemeObject.insert(output_list1[i].split(' ')[0], keyBlendObject);

            mainObject.insert(QString::number(c_frame), phonemeObject);
        }
        c_frame++;
    }

    jsonDoc.setObject(mainObject);
    file.write(jsonDoc.toJson());
    file.close();

As you can see, I am inserting the NEUTRAL object first but I am getting data not in the correct order, somtimes NEUTRAL is the the first following with the next object and somtimes not.

How can I correct this issue?


Solution

  • I did resolve it using rapidjson library instead of QJsonObject

    Based on this example

    #include <rapidjson/document.h>
    #include <rapidjson/writer.h>
    #include <rapidjson/stringbuffer.h>
    #include "rapidjson/filewritestream.h"
    #include <string>
    #include "RapidJson/prettywriter.h"
    using namespace rapidjson;
    using namespace std;
    
    
    FILE* fp = fopen("output.json", "wb"); // non-Windows use "w"
    
        char writeBuffer[65536];
        FileWriteStream os(fp, writeBuffer, sizeof(writeBuffer));
        Document d;
        d.SetObject();
    
        rapidjson::Document::AllocatorType& allocator = d.GetAllocator();
    
        size_t sz = allocator.Size();
    
        d.AddMember("version", 1, allocator);
        d.AddMember("testId", 2, allocator);
        d.AddMember("group", 3, allocator);
        d.AddMember("order", 4, allocator);
    
        Value tests(kArrayType);
        Value obj(kObjectType);
        Value val(kObjectType);
    
    
        string description = "a description";
    
        //const char *description = "a description";
        //val.SetString()
        val.SetString(description.c_str(), static_cast<SizeType>(description.length()), allocator);
        obj.AddMember("description", val, allocator);
    
        string help = "some help";
        val.SetString(help.c_str(), static_cast<SizeType>(help.length()), allocator);
        obj.AddMember("help", val, allocator);
    
        string workgroup = "a workgroup";
        val.SetString(workgroup.c_str(), static_cast<SizeType>(workgroup.length()), allocator);
        obj.AddMember("workgroup", val, allocator);
    
        val.SetBool(true);
        obj.AddMember("online", val, allocator);
    
        tests.PushBack(obj, allocator);
        d.AddMember("tests", tests, allocator);
    
        // Convert JSON document to string
        PrettyWriter<FileWriteStream> writer(os);
        char indent = ' '; // single space x 4
        writer.SetIndent(indent, 4);
        d.Accept(writer);
    

    Thank you all for your time