【问题标题】:Convert QJsonObject to Javascript object将 QJsonObject 转换为 Javascript 对象
【发布时间】:2018-04-04 19:04:17
【问题描述】:

由于QJSValueQJsonObject 上的 qt 文档不能隐式转换为 QJSValue,我想从 C++ 中调用带有 QJSEngine 的 javascript 函数,应使用 QList<QJsValue> 传递参数以调用函数另一个拥有函数本身的QJSValue

问题是我的论点之一是QJsonObject,直到现在我应该将其转换为文本,然后调用并将其传递给调用JSON.parse 以将其转换为对象的javascript函数,我正在寻找一个解决方案,让我在 C++ 中将 QJsonObject 转换为 QJSValue 并使用对象参数而不是 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);

我想要一个像 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);

【问题讨论】:

    标签: javascript c++ qt qjsengine


    【解决方案1】:

    我遇到了类似的问题。我开始沿着从 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);
    
    }
    

    在上面的代码中,您可以传递 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;
    

    【讨论】:

      【解决方案2】:

      可能,使用toScriptValue() 将单个QJsonObject 值转换为QJSValue,然后将它们连接到QJSValueList .. 并调用func 将它们附加到一个QJSValue 中。

      QJSEngine myEngine;
      QJsonObject obj;
      obj["1"] = QString("A");
      obj["2"] = QString("B");
      obj["3"] = QString("C");
      
      QJSValue func = myEngine.evaluate("(function() {var args = Array.prototype.slice.call(arguments); var res='';for(i=0; i<args.length; i++) {res += args[i]}; return res})");
      QJSValueList args;
      for (int i=0 ; i < obj.size(); i++){
          args << myEngine.toScriptValue(obj.value(obj.keys().at(i)));
      }
      QJSValue res = func.call(args);
      

      我不确定这是否是您应该做的正确事情,因为您可以直接将 QJSValue 作为对象获取,

      QJSValue res = myEngine.newObject();
      for (int i=0; i<args.length(); i++){
          res.setProperty(i,args[i]);
      }
      

      或 QJSValue 数组:

      QJSValue objArray = myEngine.newArray(args.length());
      for (int x=0; x< args.length();x++){
          objArray.setProperty(x,args[x]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        相关资源
        最近更新 更多