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();
}
相关推荐
Java成神之路-16 小时前
SpringMVC 响应实战指南:页面、文本、JSON 返回全流程(Spring系列13)
java·spring·json
fzb5QsS1p17 小时前
告别重复造轮子,Qt 快速开发脚手架
开发语言·qt·php
森G18 小时前
58、最佳实践与注意事项---------多线程、竟态条件和同步
c++·qt
小樱花的樱花19 小时前
1 项目概述
开发语言·c++·qt·ui
我命由我1234519 小时前
在 React 项目中,可以执行 npm start 命令,但是,无法执行 npm build 命令
前端·javascript·vue.js·react.js·前端框架·json·ecmascript
MinterFusion19 小时前
如何在openKylin 2.0 SP2中安装Qt(v0.2.2)(上)
开发语言·qt·软件开发·系统维护·明德融创·openkylin
特立独行的猫a20 小时前
HarmonyOS鸿蒙PC的QT应用开发:(一、开发环境搭建及第一个HelloWorld)
qt·华为·harmonyos·鸿蒙pc
青花瓷20 小时前
采用QT下MingW编译opencv4.8.1
开发语言·qt
带刺的坐椅20 小时前
RFC 9535:JSONPath 的标准化之路
java·json·jsonpath·snack4·rfc9535
cpp_learners1 天前
Linux ARM架构 使用 linuxdeployqt 打包QT程序
linux·arm开发·qt