Как добавить объект в файл Json - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь записать данные с 3 датчиков в файл json.Все, чего я хочу достичь, это записать скорость, широту и долготу в файл Json с объектом, содержащим все вышеперечисленное.Это json-файл, который содержит один объект маршрута, n подобъектов, каждый из которых содержит скорость, широту и долготу.

Эти 3 значения я получаю из 3 глобальных списков QList.Ниже приведен файл json, который хранится локально.(Двойные значения не являются фактическими значениями, только для целей тестирования)

 {
"Sensordata": [
 {
   "Speed": 1,
   "GPSLat":-12.5687,
   "GPSLong":26.125546

 },
 {
  "Speed": 1,
  "GPSLat":-12.5687,
  "GPSLong":26.125546
}
]
}

Вот как должен выглядеть json, и когда я добавляю его, он должен быть отформатирован таким же образом

void MainWindow::save_to_json()  {
QFile file_obj(".../SensorData.json");
if(!file_obj.open(QIODevice::ReadOnly)){
    qDebug()<<"Failed to open "<<"SensorData.json";
    exit(1);
}


QTextStream file_text(&file_obj);
QString json_string;
json_string = file_text.readAll();
file_obj.close();
QByteArray data_json = json_string.toLocal8Bit();
QJsonDocument doc = QJsonDocument::fromJson(data_json);

QJsonObject rootObj = doc.object();
QJsonValue SensorData = rootObj.value("SensorData");

if(!SensorData.isArray())
{
    // array expected - handle error
}

QJsonArray SensorDataArray = SensorData.toArray();

QJsonObject newObject;
newObject["Speed"] = speed_array.takeFirst();
newObject["GPSLat"] = gps_lat.takeFirst();
newObject["GPSLong"] = gps_long.takeFirst();

SensorDataArray.push_back(newObject);


}

ASSERT: "!isEmpty()" in file /home/username/Qt/5.12.1/gcc_64/include        /QtCore/qlist.h, line 347
11:32:55: The program has unexpectedly finished.
11:32:55: The process was ended forcefully.

Это ошибка, которую создает приведенный выше код.

1 Ответ

0 голосов
/ 28 марта 2019

Для изменения данных, приведенных в вашем примере, вам нужно проверить, являются ли содержащиеся в QJsonDocument данные массивом или простым объектом.В вашем случае, я полагаю, вы хотите добавить данные в массив.Попробуйте что-то вроде этого:

// Read the data
const QString filename = "example.json";
QJsonDocument doc = read(filename);

// Check that it's an array and append new data
QJsonValue sensorData = doc.value("SensorData");
if (!sensorData.isArray()) {
    // if the doc is empty you may want to create it
} 

// Get the array and insert the data
auto array = sensorData.array();
array.append(QJsonObject{
    {"Speed", speed_array.takeFirst()},
    {"GPSLat", gps_lat.takeFirst()},
    {"GPSLong",gps_long.takeFirst(),
});

// Restore your sensor data
doc.setObject(QJsonObject{{"SensorData", array}});

// Write the new data
write(filename, doc); 

Вспомогательные функции для чтения / записи документов JSON могут избежать ошибки открытия / закрытия файла:

QJsonDocument read(const QString& filename) {
    QFile file(filename);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    const QString val = file.readAll();
    file.close();
    return QJsonDocument::fromJson(val.toUtf8());
}

void write(const QString& filename, const QJsonDocument& document) {
    QFile file(filename);
    file.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
    file.write(document.toJson());
    file.close();
}

Обновления

Чтобы не перезаписывать исходный документ, необходимо обновить поле корневого объекта или использовать QJsonValueRef.

// Get a reference to your array 
QJsonObject root = doc.object();
QJsonValueRef ref = root.find("SensorData").value();

// get the array and insert the data
QJsonArray array = ref.toArray();
array.append(QJsonObject{
    {"Speed", speed_array.takeFirst()},
    {"GPSLat", gps_lat.takeFirst()},
    {"GPSLong",gps_long.takeFirst(),
});

// Update the ref with the new data
ref = array

// update the modified data in the json document
doc.setObject(root);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...