Qt将字符串保存到JSON

时间:2017-11-28 23:08:43

标签: c++ json qt

我试图将我的航点保存到.json文件中,但它总是保存错误的字符串..我不知道它来的地方。

这是我的代码:

for (int i = 1; i < path->GetPointCount(); i++) {
    Vector lonlatalt;
    path->GetPointLocation(i).GetGeodetic(&lonlatalt);
    sstr << "waypoint";
    sstr << i;
    sstr << " ";
    sstr << lonlatalt.x;
    sstr << " ";
    sstr << lonlatalt.y;
    sstr << " 0.0";
    sstr << std::endl;

    std::string alt = " 0.0";

    QJsonObject json;
    json["waypoint"+i] = lonlatalt.x, lonlatalt.y, alt;
    QJsonDocument json_doc(json);
    QString json_string = json_doc.toJson();
    QString filename = "./tempwpf";

    QFile save_file(filename);
    if(!save_file.open(QIODevice::WriteOnly)){
        qDebug() << "failed to open save file";
    }
    save_file.write(json_string.toLocal8Bit());
    save_file.close();
}

json文件的输出应为:

{
  "waypoint0": "10.05456, 51.02453, 0.0",
  "waypoint1": "10.05456, 51.02453, 0.0",
  "waypoint2": "10.05456, 51.02453, 0.0",
  "waypoint3": "10.05456, 51.02453, 0.0",
  "waypoint4": "10.05456, 51.02453, 0.0",
  "waypoint5": "10.05456, 51.02453, 0.0",
  "waypoint6": "10.05456, 51.02453, 0.0"
}

1 个答案:

答案 0 :(得分:4)

json["waypoint"+i] = lonlatalt.x, lonlatalt.y, alt;

这一行中没有一件正确的事情。

"waypoint"+i

"waypoint"是一个字符串文字,即char的数组,它衰减到指向其第一个元素的指针;现在,如果你将一个整数加到一个指针上,你会得到一个递增的指针,即指向第一个之后i个元素的指针。

因此,在这里,你实际上是从"waypoint"个字符开始的i子字符串。 "waypoint"+1 =&gt; "aypoint"; "waypoint"+2 =&gt; "ypoint"等等。

鉴于您无论如何使用Qt和QString将其放入JSON文档中,您只需使用Qt字符串格式化方法;所以,在左侧你可以这样做:

json[QString("waypoint%1").arg(i)]

在右边,它又错了;在这里你错误地使用了逗号运算符,它在两侧计算表达式并丢弃左边的表达式;所以当你写作

lonlatalt.x, lonlatalt.y, alt
你正在写作

(lonlatalt.x, lonlatalt.y), alt

归结为普通alt

现在,如果要将其格式化为以逗号分隔的字符串,则可以再次使用QString方法:

json[QString("waypoint%1").arg(i)] = QString("%1, %2, 0.0").arg(lonlatalt.x, 0, 'f', 5).arg(lonlatalt.y, 0, 'f', 5)

最后,您在每次迭代时创建/保存一个新的QJsonDocument,因此每次创建只有一个航点的文件并覆盖前一个航点时。你应该在循环之外移动创建/保存:

QJsonObject json;

for

之前
json["waypoint"+i] = lonlatalt.x, lonlatalt.y, alt;

留在里面,其余的都在外面。请注意,即使要保存的代码也不是最理想的:json_doc.toJson()已经返回UTF-8中的QByteArray(通常用作&#34;规范&#34; JSON编码);您正在将其重新转换为QString,然后将其转换回8位编码(这是有损的,很可能是无意的)。

此外,您检查文件是否已成功打开,即使出现错误也要写入文件 - 这绝对是一个坏主意。

最后,不需要close() - 当QFile超出范围时,它会自动执行。

总结一下:

QFile save_file("./tempwpf");
if(save_file.open(QIODevice::WriteOnly)){
    QJsonDocument json_doc(json);
    save_file.write(json_string.toJson());
} else {
    qDebug() << "failed to open save file";
}
相关问题