I wrote a code in C++ to generate a .json
file using the JsonCpp library. My issue is that I'm struggling to maintain the display order as it appears in the sequence of code within the file. Currently, the display order is alphabetical, which doesn't match the desired sequence.
To resolve this and maintain the desired order, I'm wondering if there's a solution within the JsonCpp library or an alternative approach or library I should consider ?!
#include <iostream>
#include <fstream>
#include <jsoncpp/json/json.h>
#include <memory>
int main() {
// Créer un objet Json::Value pour stocker les données
Json::Value jsonData;
// Enregistrement 1
Json::Value enreg1;
enreg1["CAT"] = "4";
enreg1["Long"] = "19";
enreg1["Day"] = "0";
enreg1["Time"] = "13:15:37:86";
enreg1["Fspec"] = "fa12gh";
Json::Value Item1;
Item1["AI"] = "1a";
Item1["CC"] = "23";
enreg1["Item1"] = Item1;
// Ajouter Enreg_1 à l'objet JSON principal
jsonData["Enreg_1"] = enreg1;
// Ouvrir un fichier pour écrire le JSON
std::ofstream file("do.json");
if (file.is_open()) {
// Utiliser un Writer de JsonCpp pour écrire l'objet JSON dans le fichier
Json::StreamWriterBuilder builder;
std::unique_ptr<Json::StreamWriter> jsonWriter(builder.newStreamWriter());
// Écrire l'objet JSON dans le fichier
jsonWriter->write(jsonData, &file);
// Fermer le fichier
file.close();
std::cout << "Fichier JSON généré avec succès." << std::endl;
} else {
std::cerr << "Impossible d'ouvrir le fichier pour écrire." << std::endl;
return 1;
}
return 0;
}
I expect this :
{
"Enreg_1" :
{
"CAT" : "4",
"Long" : "19",
"Day" : "0",
"Time" : "13:15:37:86",
"Fspec" : "fa12gh",
"Item1" :
{
"AI" : "1a",
"CC" : "23"
}
}
}
But I have this instead (alphabetical order):
{
"Enreg_1" :
{
"CAT" : "4",
"Day" : "0",
"Fspec" : "fa12gh",
"Item1" :
{
"AI" : "1a",
"CC" : "23"
},
"Long" : "19",
"Time" : "13:15:37:86"
}
}
As the commenters on your question have noted, JsonCPP uses an std::map
to store its object members. If you switch to nlohmann::json you can override the backing store for objects to preserve insertion order.
There is even a premade type for you to use:
using ordered_json = nlohmann::ordered_json;