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

399 Views Asked by At

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?

2

There are 2 best solutions below

0
On BEST ANSWER

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

0
On

In JSON there are two structures you can use for saving data:

1.) JSON Objects: A collection of key/value pairs. This collection is NOT ordered. In various languages its realized via associative data structures like dictionaries, hash tables etc. Internally qt saves JSON objects via QHash<QString, QVariant> containers.

2.) JSON Arrays: An ordered list of values (which can be JSON Objects). In programming languages this is realized as an array/vector/whatever. Qt uses a QVariantList (QList<QVariant) internally.