c++ - Qt - 带注释的 JSON

标签 c++ json qt qt5 jsonparser

我知道 JSON 中的 C/C++ 风格注释(//.../* ... */)是 invalid但是因为有某种叫做sense的人(不知道那是什么)故意想办法使用无效的JSON,例如 JSON minifyRapidJSON .

因为Qt自带了它自己的JSON classes我对发现任何关于评论的内容并不感到惊讶。所以问题是...

示例输入文件:

test.json:

{
    // This is a comment
    /* This is a another comment */
    "property1": "It's just json",
    "foo": "bar"
}

Qt 是否提供某种方式来使用(无效)注释 JSON,或者我是否必须使用另一个库?

最佳答案

正如我在上面的评论中提到的,您可以使用 QJSEngine 为您完成大部分繁重的工作。您作为示例提供的字符串本身不会计算为 JSON,但它绝对是有效的 JavaScript。因此,如果我们可以让 JavaScript 引擎来评估该文本(因此忽略注释),我们就可以使用脚本引擎中的内置 JSON 对象来完成将其转换回字符串的所有工作。

最简单的事情就是利用 JSEngine 作为 JSON 解析器:

QString str = <your json input file that has comments>
QJSValue val = jsengine.evaluate(text);

该表达式的结果是 QJSValue (val) 的实例,它将是完全解析的对象树。您可以使用 QJSValue 上的所有方法来枚举子对象和值。你就完成了。

如果您确实想删除注释以用于不同的 JSON 解析器(包括 Qt 中内置的解析器),您可以对其调用 JSON.stringify:

#include <QJSEngine>
#include <QJSValue>

QString stripCommentsOffJSon(const QString& originalText)
{
    QJSEngine jsengine;
    QString result;

    // create an assignment statement so that evaulation works reliably
    QString evalExpression = "x=" + originalText + ";";
    QJSValue val = jsengine.evaluate(QString(evalExpression));

    if (val.isObject() || val.isArray() || val.isNumber() || val.isBool() || val.isNull() || val.isString())
    {
        QJSValue func = jsengine.evaluate(QString("JSON.stringify"));
        QJSValueList funcArgs;
        funcArgs.append(val);
        QJSValue val2 = func.call(funcArgs);
        if (val2.isString())
        {
            result = val2.toString();
        }
    }

    return result;
}

最终结果是上述函数的返回值是一个没有注释的有效JSON字符串。您现在可以将其输入到您选择的任何 JSON 解析器中。

示例(使用您的示例文件)

 const char* text = "\
 {\n\
     // This is a comment\n\
     /* This is a another comment */\n\
     \"property1\": \"It's just json\",\n\
     \"foo\": \"bar\"\n\
 }";

QString result = stripCommentsOffJSon(QString(text));
std::wcout << L"Result: " << result.toStdWString() << std::endl;

输出:

Result: {"foo":"bar","property1":"It's just json"}

如果您已经是 QML 应用程序,那么就可以开始了。对于控制台或小部件应用程序,您需要引入 QML 库。我将其添加到控制台应用程序的 .pro 文件中:

QT += qml

关于c++ - Qt - 带注释的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52019406/

相关文章:

c++ - 如何限制 QHeaderView 的大小(调整部分大小时)?

C++ 不能在结构中存储指针

c++ - 如何让strnset在QT中工作?

qt - 小部件未在基本 Qt 应用程序(QMainWindow)中显示

json - 如何在NiFi中使用EvaluateJsonPath处理器拆分json

c++ - GLEW 未知类型名称

c++ - 转换需要reinterpret_cast、C 风格转换或函数风格转换

c++ - 初始化 vector (C++)

javascript - 显示与数组值匹配的不同按钮

javascript - 是否无法使用 JSON.stringify 对错误进行字符串化?