Я создаю консоль на основе оболочки v8, я взял пример кода, который поставляется с v8, и он работает очень хорошо, но я пытаюсь преобразовать объект v8 :: в его строковую версию (json), ноне нашел способ сделать это.
Вот мой пример кода внутри shell.cc:
v8::Handle test(const v8::Arguments& args) {
v8::HandleScope handle_scope;
const char* json;
v8::String::Utf8Value strJson(args[0]);
printf(ToCString(json));
if (args[0]->IsObject()) {
printf("it's an object\n");
}
return v8::String::New("");
}
В оболочке я создал файл test.js со следующим:
var a = { name: 'John' };
test(a);
и я получаю это после выполнения js в консоли оболочки:
[object Object]
It's an object
Что мне нужно:
{ "name": "John" }
, если я изменю код js на:
var a = { name: 'John'}
test(JSON.stringify(a));
это работает очень хорошо, но я не хочу, чтобы пользователь знал, как анализировать переменную javascript в json, и я не хочу проверять каждый вход в объекте и анализировать его вручную.
Есть ли способ выполнить ту же инструкцию внутри кода shell.cc в C?что-то вроде:
v8::Handle<v8::String> temp = JSON.parse(arg[0]);
обновление: вот как я справляюсь с этим, но я хочу более чистый способ сделать то же самое:
const char* toJson(const v8::Local<v8::Object>& obj) {
std::stringstream ss;
ss << "{";
v8::Local<v8::Array> propertyNames = obj->GetPropertyNames();
for (int x = 0; x < propertyNames->Length(); x++) {
if (x != 0) {
ss << ", ";
}
v8::String::Utf8Value name(propertyNames->Get(x));
ss << "\"" << ToCString(name) << "\":";
v8::Local<v8::Value> val = obj->GetInternalField(x);
if (val->IsObject()) {
ss << toJson(val->ToObject());
} else {
ss << "\"" << ToCString(v8::String::Utf8Value(val)) << "\"";
}
}
ss << "}";
const char* result = ss.str().c_str();
return result;
}
v8::Handle test(const v8::Arguments& args) {
v8::HandleScope handle_scope;
const char* json;
v8::String::Utf8Value strJson(args[0]);
if (args[0]->IsObject()) {
char* json = toJson(args[0]);
// ...
// Some operations with the json
// ...
}
return v8::String::New("");
}