Создайте массив json в переполнении стека

Поэтому я пытаюсь динамически создать объект json в c ++. Я хочу добавить метку времени, а затем массив с включенными данными.

Вот так будет выглядеть мой json String:

{
"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"}
]
}

Я совершенно новичок в C ++ и использую пакет Casablanca (C ++ REST SDK).
Так что у меня действительно трудные времена при создании кода. И я не могу найти какие-либо рабочие решения. Я нашел это в вики

Создайте объект 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"));

и это работает для меня. Но как мне создать массив?

Я попробовал несколько вещей, но ничего не получалось. Может быть, есть лучшая упаковка? Но насколько я понял, это официальный пакет micorosft для json и http.

Помощь была бы действительно хорошей!

9

Решение

Есть 2 механизма. Если вы привыкли к библиотекам std c ++, это должно выглядеть знакомо. Вектор элемента получен из 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);

И, если вы предпочитаете более чистый внешний вид и можете принять менее эффективный скомпилированный результат:

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

Из вашего сообщения вы перепробовали кучу вещей. Если вы попробовали подобные механизмы, но они не сработали, дайте нам пример программы, которая демонстрирует сбой, и у нас будет трещина на нем.

Чтобы получить базовую структуру в вашем файле выше:

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

Другие решения

Вот как создать массив динамически, используя vector, Предположим, у вас есть 10 транспортных средств для добавления.

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

Вы могли бы выразить это так:

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

Вот еще один метод создания массива json в Касабланке:

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

Если вы хотите использовать массив в качестве ответа на полученный http_request (в случае ниже это http_request request), вы можете использовать следующий фрагмент кода в качестве примера:

    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
По вопросам рекламы [email protected]