Я пытаюсь записать данные с 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.

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

0
Benjamin Beer 28 Мар 2019 в 13:30

1 ответ

Лучший ответ

Для изменения данных, приведенных в вашем примере, вам нужно проверить, являются ли содержащиеся в 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);
0
mohabouje 30 Мар 2019 в 13:04