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();
}
相关推荐
≮傷£≯√13 小时前
Opencv VideoCapture
qt·opencv
烟锁池塘柳019 小时前
Conda 创建环境报错:Unable to read repodata JSON file,清华源 pkgs/free 失效解决方法
json·conda
雨田言炎20 小时前
十、QThread多线程
linux·服务器·开发语言·前端·qt
云水一下2 天前
零基础玩转bWAPP靶场(四十五):XSS - Reflected (JSON)
web安全·json·xss·bwapp·reflected
常乐か2 天前
在 Ubuntu 24.04 中编译 Qt 5.15.2 项目完全指南
linux·qt·ubuntu
沫璃染墨2 天前
《Qt从零入门系列(二):Qt开发环境搭建——从Qt Creator到SDK配置》
c++·ide·qt
我是小灰灰吖2 天前
Ubuntu 22.04 切换为 X11 会话以解决 QT 桌面程序兼容性问题
linux·qt·ubuntu
≮傷£≯√2 天前
QT配置FFmpeg
开发语言·qt·ffmpeg
≮傷£≯√2 天前
配置 opencv Qt项目
人工智能·qt·opencv
qq_401700412 天前
Qt Modbus协议0x00
开发语言·qt