garbage at the end of the document

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();
}
相关推荐
SNAKEpc121382 小时前
PyQtGraph应用(一):常用图表图形绘制
python·qt·pyqt
SunkingYang2 小时前
QT编译报错:“error: macro name missing“原因分析与解决方案详解
qt·error·macro·编译报错·name·missing
未来可期LJ2 小时前
【Qt 开发】Qt QFileDialog 文件对话框详解
开发语言·qt
SilentSlot2 小时前
【QT-QML】2. QML语法
开发语言·qt·qml
轩情吖2 小时前
Qt常用控件之QDial和QSlider
开发语言·qt
轩情吖2 小时前
Qt多元素控件之QListWidget
开发语言·前端·c++·qt·控件·qlistwidget·桌面级
_xaboy2 小时前
开源Vue组件-动态表单组件设计,告别重复CRUD,JSON一键生成表单
前端·vue.js·低代码·开源·json
一晌小贪欢2 小时前
Python JSON 处理最佳实践:从入门到构建健壮的容错系统
开发语言·python·json·字典·python字典·python办公
SunkingYang2 小时前
QT中如何使用使用QRadioButton控件
qt·控件·用法·互斥·qradiobutton·单选按钮