QByteArray 转 QJsonDocument ,提示garbage at the end of the document。
经分析原因是QByteArray最后一个字符为'\0', Json规范中没有定义'\0',所以解析时会失败,解决方案是移除结尾的'\0',具体方法如下:
cpp
//方案1(推荐)
QByteArray jsonData5 = jsonData4;
jsonData5 = jsonData5.trimmed(); //移除开头和结尾的'\t', '\n', '\v', '\f', '\r', and ' '
jsonData5.replace('\0', ""); //移除'\0'
//方案2(如果'\n'、'\t'等字符结尾,解析也会失败)
QString jsonData6 = QString::fromUtf8(jsonData4);

cpp
#include <QCoreApplication>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonParseError>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray jsonData = "{\"key\": \"value\"}";
QByteArray jsonData2 = "{\"key\": \"value\"}\0";
const char* cjsonData2 = "{\"key\": \"value\"}\0"; //C格式
QByteArray jsonData3;
jsonData3.append('{');
jsonData3.append('"');
jsonData3.append('k');
jsonData3.append('e');
jsonData3.append('y');
jsonData3.append('"');
jsonData3.append(':');
jsonData3.append(' ');
jsonData3.append('"');
jsonData3.append('v');
jsonData3.append('a');
jsonData3.append('l');
jsonData3.append('u');
jsonData3.append('e');
jsonData3.append('"');
jsonData3.append('}');
QByteArray jsonData4;
jsonData4.append('{');
jsonData4.append('"');
jsonData4.append('k');
jsonData4.append('e');
jsonData4.append('y');
jsonData4.append('"');
jsonData4.append(':');
jsonData4.append(' ');
jsonData4.append('"');
jsonData4.append('v');
jsonData4.append('a');
jsonData4.append('l');
jsonData4.append('u');
jsonData4.append('e');
jsonData4.append('"');
jsonData4.append('}');
jsonData4.append('\0');
//方案1(推荐)
QByteArray jsonData5 = jsonData4;
jsonData5 = jsonData5.trimmed(); //移除开头和结尾的'\t', '\n', '\v', '\f', '\r', and ' '
jsonData5.replace('\0', ""); //移除'\0'
//方案2(如果'\n'、'\t'等字符结尾,解析也会失败)
QString jsonData6 = QString::fromUtf8(jsonData4);
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &error);
if(jsonDoc.isNull())
{
qDebug() << "jsonData" << error.error << error.offset << error.errorString();
}
else
{
qDebug() << jsonData.size() << "jsonData" << jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
}
jsonDoc = QJsonDocument::fromJson(jsonData2, &error);
if(jsonDoc.isNull())
{
qDebug() << "jsonData2" << error.error << error.offset << error.errorString();
}
else
{
qDebug() << jsonData2.size() << "jsonData2" << jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
}
jsonDoc = QJsonDocument::fromJson(cjsonData2, &error);
if(jsonDoc.isNull())
{
qDebug() << "cjsonData2" << error.error << error.offset << error.errorString();
}
else
{
qDebug() << strlen(cjsonData2) << "cjsonData2" << jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
}
jsonDoc = QJsonDocument::fromJson(jsonData3, &error);
if(jsonDoc.isNull())
{
qDebug() << "jsonData3" << error.error << error.offset << error.errorString();
}
else
{
qDebug() << jsonData3.size() << "jsonData3" << jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
}
jsonDoc = QJsonDocument::fromJson(jsonData4, &error);
if(jsonDoc.isNull())
{
qDebug() << jsonData4.size() << "jsonData4" << error.error << error.offset << error.errorString();
}
else
{
qDebug() << jsonData4.size() << "jsonData4" << jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
}
jsonDoc = QJsonDocument::fromJson(jsonData5, &error);
if(jsonDoc.isNull())
{
qDebug() << "jsonData5" << error.error << error.offset << error.errorString();
}
else
{
qDebug() << jsonData5.size() << "jsonData5" << jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
}
jsonDoc = QJsonDocument::fromJson(jsonData6.toUtf8(), &error);
if(jsonDoc.isNull())
{
qDebug() << "jsonData6" << error.error << error.offset << error.errorString();
}
else
{
qDebug() << jsonData6.size() << "jsonData6" << jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
}
return a.exec();
}