将 QJsonObject 转换为 Javascript 对象

e.j*_*dar 1 javascript c++ qt qjsengine

由于 qt 文档上的QJSValueQJsonObjectinst 不能隐式转换为QJSValue,我想QJSEngine从 C++ 调用一个 javascript 函数,参数应该传递到QList<QJsValue>调用另一个QJSValue保存函数本身的函数。

问题是我的一个论点是QJsonObject,到目前为止,我应该将其转换为文本,然后调用并将其传递给调用将JSON.parse其转换为对象的 javascript 函数,我正在寻找一种解决方案,让我可以将其转换QJsonObjectQJSValueC++并使用对象参数而不是 json 文本调用 javascript 函数。

目前代码如下

QJsonObject obj;
obj["1"] = QString("A");
obj["2"] = QString("B");

QJSValue func = myEngine.evaluate("(function(arg) { var obj = JSON.parse(arg); var res = obj[\"1\"] + obj[\"2\"]; return res; })");
QJSValueList args;
args << QString(QJsonDocument(obj).toJson());
QJSValue res = func.call(args);
Run Code Online (Sandbox Code Playgroud)

我想要一个像QJSValue ConvertToQJSValue(QJsonObject object)这样的函数:

QJsonObject obj;
obj["1"] = QString("A");
obj["2"] = QString("B");

QJSValue func = myEngine.evaluate("(function(arg) { var res = arg[\"1\"] + arg[\"2\"];  return res; })");
QJSValueList args;
args << ConvertToQJSValue(obj);
QJSValue res = func.call(args);
Run Code Online (Sandbox Code Playgroud)

sel*_*bie 5

我有类似的问题。我开始从 QJsonValue 递归地遍历树并从中构建 QJSValue 。

QJSValue Convert(QJSEngine* engine, const QJsonValue& val)
{
    if (val.isBool())
    {
        return QJSValue(val.toBool());
    }
    else if (val.isString())
    {
        return QJSValue(val.toString());
    }
    else if (val.isDouble())
    {
        return QJSValue(val.toDouble());
    }
    else if (val.isNull())
    {
        return QJSValue(QJSValue::NullValue);
    }
    else if (val.isUndefined())
    {
        return QJSValue(QJSValue::UndefinedValue);
    }
    else if (val.isObject())
    {
        QJsonObject obj = val.toObject();
        QJSValue newobj = engine->newObject();
        for (auto itor = obj.begin(); itor != obj.end(); itor++)
        {
            QString key = itor.key();
            QJsonValue value = itor.value();
            QJSValue convertedValue = Convert(engine, value);
            newobj.setProperty(key, convertedValue);
        }
        return newobj;
    }
    else if (val.isArray())
    {
        QJsonArray arr = val.toArray();
        QJSValue newobj = engine->newArray(arr.size());
        for (int i = 0; i < arr.size(); i++)
        {
            QJsonValue value = arr[i];
            QJSValue convertedValue = Convert(engine, value);
            newobj.setProperty(i, convertedValue);
        }
        return newobj;
    }


    // ASSERT(FALSE && "This shouldn't happen");
    return QJSValue(QJSValue::UndefinedValue);

}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,您可以传递 QJsonObject 或任何其他类型的 JSON 节点以转换为 QJSValue。

我目前正在采用更接近您原始解决方案的方法 - 只需从引擎调用 JSON.parse :

QJSValue func = engine->evaluate("JSON.parse");
QJSValueList args;
args.append(jsonText); // jsonText is a QString or QJSValue string
QJSValue result = func.call(args);
return result;
Run Code Online (Sandbox Code Playgroud)