web-dev-qa-db-fra.com

Créer un tableau json en C++

Donc, je suis en train d'essayer de créer dynamiquement un objet JSON en c ++. Je veux ajouter un horodatage, puis un tableau avec les données incluses.

Voilà à quoi ressemblerait ma chaîne json: 

{
    "timestep": "2160.00",
    "vehicles": [
        {
            "id": "35092_35092_353",
            "x": "6.988270",
            "y": "50.872139",
            "angle": "-20.812787",
            "type": "passenger_P_14_1",
            "speed": "0.000000",
            "pos": "4.600000",
            "lane": "4.600000",
            "slope": "4.600000"
        },
        {
            "id": "35092_35092_353",
            "x": "6.988270",
            "y": "50.872139",
            "angle": "-20.812787",
            "type": "passenger_P_14_1",
            "speed": "0.000000",
            "pos": "4.600000",
            "lane": "4.600000",
            "slope": "4.600000"
        },
        {
            "id": "35092_35092_353",
            "x": "6.988270",
            "y": "50.872139",
            "angle": "-20.812787",
            "type": "passenger_P_14_1",
            "speed": "0.000000",
            "pos": "4.600000",
            "lane": "4.600000",
            "slope": "4.600000"
        }
    ]
}

Je suis tout à fait nouveau en C++ et j'utilise le package Casablanca (SDK C++ REST). J'ai donc beaucoup de mal à produire le code. Et je ne trouve aucune solution de travail. J'ai trouvé ceci sur le wiki

Créez un objet JSON:

json::value obj;
obj[L"key1"] = json::value::boolean(false);
obj[L"key2"] = json::value::number(44);
obj[L"key3"] = json::value::number(43.6);
obj[L"key4"] = json::value::string(U("str"));

et ça marche pour moi. Mais comment puis-je créer un tableau?

j'ai essayé plusieurs choses mais rien n'a fonctionné. Peut-être theres un meilleur paquet? Mais pour autant que je sache, c’est un paquet micorosft officiel pour JSON et http.

L'aide serait vraiment gentille!

9
Hannes

Il y a 2 mécanismes. Si vous êtes habitué aux bibliothèques std c ++, cela devrait vous paraître familier. Le vecteur d'élément est dérivé de std :: vector.

json::value::element_vector e;
// the first item in the pair is the array index, the second the value
e.Push_back(std::make_pair(json::value(0), json::value(false)));
e.Push_back(std::make_pair(json::value(1), json::value::string(U("hello"))));
json::value arr(e);

Et, si vous préférez un aspect plus net et que vous pouvez accepter un résultat compilé moins efficace:

json::value arr;
arr[0] = json::value(false);
arr[1] = json::value(U("hello"));

De votre message, vous avez essayé un tas de trucs. Si vous avez essayé des mécanismes comme ceux-ci mais qu'ils n'ont pas fonctionné, donnez-nous un exemple de programme qui démontre l'échec et nous nous en occuperons.

Pour obtenir la structure de base dans votre fichier ci-dessus:

json::value vehicles;
vehicles[0] = // 1st vehicle object
vehicles[1] = // 2nd vehicle object
// etc
json::value root;
root[L"timestep"] = json::number(2160.0);
root[L"vehicles"] = vehicles;
3
FatalFlaw

Voici comment créer un tableau de manière dynamique à l'aide de vector. Supposons que vous avez 10 véhicules à ajouter.

std::vector<web::json::value> arrayVehicles;
for(int i = 0; i < 10; i++)
{
    web::json::value vehicle;
    std::string vehicleID = "id_prefix_" + std::to_string(i);
    vehicle["id"] = web::json::value::string(vehicleID);
    vehicle["x"] = web::json::value::number(6.988270);
    vehicle["y"] = web::json::value::number(50.872139);

    arrayVehicles.Push_back(vehicle);
}

web::json::value myJSON;
myJSON["vehicles"] = web::json::value::array(arrayVehicles);
6
Nhon Nguyen

Vous pourriez le dire comme ceci:

json::value vehicle1;
vehicle1[L"id"] = json::value::string(L"35092_35092_353");
vehicle1[L"x"] = json::value::number(6.988270);
vehicle1[L"y"] = json::value::number(50.872139);

json::value vehicle2;
vehicle2[L"id"] = json::value::string(L"35092_35092_353");
vehicle2[L"x"] = json::value::number(1.23456);
vehicle2[L"y"] = json::value::number(6.78901);

json::value vehicles;
vehicles[L"timestamp"] = json::value::number(2160);
vehicles[L"vehicles"] = json::value::array({vehicle1, vehicle2});
5
Marius Bancila

Voici une autre méthode pour produire un tableau json à Casablanca:

int size = 3;
web::json::value yourJson;
yourJson[U("vehicles")] = web::json::value::array(size);

yourJson[U("vehicles")].as_array()[0] = web::json::value(U("some entry"));
yourJson[U("vehicles")].as_array()[1] = web::json::value(U("another entry"));
//...
3
davidhigh

Si vous souhaitez utiliser le tableau comme réponse à une demande http_request reçue (dans le cas ci-dessous, il s'agit d'un http_request request), vous êtes libre d'utiliser l'extrait de code suivant comme exemple:

    json::value answer;
    auto array = answer.array();

    for (size_t i = 0; i < GenFile.GetNumberOfCurves(); i++)
    {
        web::json::value vehicle;

        vehicle[L"smth"] = web::json::value::number(WhatEverArray[i].whatever());

        array[i] = vehicle;
    }

    request.reply(status_codes::OK, array);
0
Dmitry Gladkov