Использование stringify из оболочки v8

Я создаю консоль на основе оболочки v8, я взял пример кода, который поставляется с v8, и он работает очень хорошо, но я пытаюсь преобразовать v8::object в строковую версию (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("");
    }

В shell я создал файл test.js с этим:



    var a = {  name: 'John' };
    test(a);

и я получаю следующее после выполнения js в консоли shell:



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

update: Вот как я это делаю, но мне нужен более чистый способ сделать то же самое:



    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("");
    }

7
задан Cross 24 January 2012 в 20:08
поделиться