2013-04-13 13 views

risposta

5

È necessario prendere un riferimento all'oggetto globale e quindi utilizzare il metodo 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

Alcune cose sono evidentemente cambiate nel API V8: 1. Non c'è 'GetCurrent' e di solito si ottiene il globale dal isolare utilizzando' isolate-> GetCurrentContext() -> Globale() '. 2. Non c'è 'String :: New()' e di solito vuoi 'String :: NewFromUTF8()'. Non pensare che questo giustifica un'altra risposta, ma sarebbe una chiamata se aggiorni la tua. – Stav

1

Alcune API del nodo sono state modificate dalla pubblicazione dell'OP. Supponendo una versione di node.js 7.7.1, il codice si trasforma in qualcosa sulla falsariga di;

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

Fondamentalmente, il codice ottiene l'oggetto JSON dal motore, ottiene un riferimento alla funzione stringify di tale oggetto, e poi chiama. Il codice equivale al javascript;

var j = JSON.stringify(obj); 

Ulteriori alternative basate su v8 includono l'utilizzo della classe JSON.

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