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();
}
相关推荐
蓝祁子yoky6 小时前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
飞浪纪元[FWC–FE]9 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt
程序员大阳10 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
ShineWinsu10 小时前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
ShineWinsu14 小时前
对于Qt:QPushButton常见属性的解析
开发语言·c++·qt·api·gui·按钮·qpushbutton
飞浪纪元[FWC–FE]14 小时前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt
Lhan.zzZ14 小时前
用 Qt 构建线程安全的通讯静态库:从线程亲和性到完整工程
c++·vscode·qt·tcp/ip·udp
飞浪纪元[FWC–FE]14 小时前
Qt 构建排错实录:从 MSB 1009 到生成器选型
开发语言·数据库·qt
光影6271 天前
Unittest单元测试基础速记
测试工具·单元测试·json·测试覆盖率
小徐不徐说1 天前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计