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();
}
相关推荐
半杯咖啡半行码2 小时前
Qt 开发基础:版本演进、常用工具与多平台安装
开发语言·qt
qq_401700417 小时前
Qt Signal Mapper:一堆按钮,怎么共用一个槽函数
开发语言·qt
Python图像识别7 小时前
35-【2027毕设】YOLO11中草药检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
Lhan.zzZ8 小时前
Qt/QML:业务记录单展示、签名确认与 PDF 导出开发
c++·qt·pdf
Quz18 小时前
QML 动画选择:GIF与Lottie 的区别,以及 Qt 6.8 与 6.11 的 Lottie 实现差异
qt
胖头鱼的鱼缸(尹海文)20 小时前
胖头鱼的技术专栏-474 从能跑到能上线:PG SplitJSON 0.2.0 和 0.1.0 差在哪(20261008)
postgresql·json
时间的拾荒人1 天前
Qt 界面美化实战:QSS 样式表
开发语言·qt·面试
qq_401700411 天前
Qt 串口/网口通信:Hex 与 ASCII 编码转换深度指南
开发语言·数据库·qt
?? Daisy1 天前
Claude Code 接入 GPT:settings.json 两种配置方法(2026-10)
gpt·json
小静AI工程实验室1 天前
Python 爬虫解析 JSON-LD:多块 script、@graph 与坏数据的 9 个边界
爬虫·python·json