Конвертировать QJsonObject в объект Javascript

Как Qt документы на QJSValue, QJsonObject неявно необратимо QJSValueЯ хочу вызвать функцию JavaScript с QJSEngine из C ++ аргументы должны быть переданы с QList<QJsValue> вызвать функцию другого QJSValue который содержит саму функцию.

Проблема в том, что один из моих аргументов QJsonObjectДо сих пор я должен преобразовать его в текст, затем вызвать и передать его функции JavaScript, которая вызывает JSON.parse для преобразования его в объект, я ищу решение, которое позволяет мне конвертировать QJsonObject в QJSValue в C ++ и вызовите функцию javascript с аргументами объекта вместо текста json.

В настоящее время код похож на что-то ниже

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);

0

Решение

У меня была похожая проблема. Я начал идти по пути простой рекурсивной прогулки по дереву из 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

Другие решения

Возможно конвертировать персонажа QJsonObject значения для QJSValue с помощью toScriptValue()затем объединить их до 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]);
}
1

По вопросам рекламы [email protected]