2013-04-13 14 views

Odpowiedz

5

Musisz pobrać odniesienie do obiektu globalnego, a następnie pobrać metodę stringify;

Local<Object> obj = ... // Thing to stringify 

// Get the global object. 
// Same as using 'global' in Node 
Local<Object> global = Context::GetCurrent()->Global(); 

// Get JSON 
// Same as using 'global.JSON' 
Local<Object> JSON = Local<Object>::Cast(
    global->Get(String::New("JSON"))); 

// Get stringify 
// Same as using 'global.JSON.stringify' 
Local<Function> stringify = Local<Function>::Cast(
    JSON->Get(String::New("stringify"))); 

// Stringify the object 
// Same as using 'global.JSON.stringify.apply(global.JSON, [ obj ]) 
Local<Value> args[] = { obj }; 
Local<String> result = Local<String>::Cast(stringify->Call(JSON, 1, args)); 
+0

Niektóre rzeczy pozornie zmieniło w V8 API: 1. Nie ma 'GetCurrent' i zazwyczaj można uzyskać globalny z izolatu przy użyciu' isolate-> GetCurrentContext() -> Global() '. 2. Nie ma 'String :: New()' i zwykle chcesz 'String :: NewFromUTF8()'. Nie myśl, że to usprawiedliwia inną odpowiedź, ale zadzwoni, jeśli zaktualizujesz swoją. – Stav

1

Niektóre z interfejsów API węzła zostały zmienione z publikacji OP. Zakładając, że jest to plik node.js w wersji 7.7.1, kod przekształca się w coś podobnego do linii;

std::string ToJson(v8::Local<v8::Value> obj) 
{ 
    if (obj.IsEmpty()) 
     return std::string(); 

    v8::Isolate* isolate = v8::Isolate::GetCurrent(); 
    v8::HandleScope scope(isolate); 

    v8::Local<v8::Object> JSON = isolate->GetCurrentContext()-> 
     Global()->Get(v8::String::NewFromUtf8(isolate, "JSON"))->ToObject(); 
    v8::Local<v8::Function> stringify = JSON->Get(
     v8::String::NewFromUtf8(isolate, "stringify")).As<v8::Function>(); 

    v8::Local<v8::Value> args[] = { obj }; 
    // to "pretty print" use the arguments below instead... 
    //v8::Local<v8::Value> args[] = { obj, v8::Null(isolate), v8::Integer::New(isolate, 2) }; 

    v8::Local<v8::Value> const result = stringify->Call(JSON, 
     std::size(args), args); 
    v8::String::Utf8Value const json(result); 

    return std::string(*json); 
} 

Zasadniczo kod pobiera obiekt JSON z silnika, uzyskuje referencję do funkcji stringify tego obiektu, a następnie zwraca go. Kod jest równoznaczny z javascript;

var j = JSON.stringify(obj); 

Inne alternatywy oparte na V8 obejmują użycie klasy JSON.

auto str = v8::JSON::Stringify(v8::Isolate::GetCurrent()->GetCurrentContext(), obj).ToLocalChecked(); 
v8::String::Utf8Value json{ str }; 
return std::string(*json); 
Powiązane problemy