2013-04-13 8 views
9

node.jsバインディングを作成していますが、v8 :: ObjectインスタンスからJSON文字列を生成したいとします。私はC++でそれをやりたいnode.jsには既にJSON.stringifyがあるので、私はそれを使いたいと思います。しかし、私はC++コードからアクセスする方法を知らない。node.jsからJSON.stringifyにアクセスするC++バインディング

答えて

5

グローバルオブジェクトへの参照を取得してから、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

いくつかのものは、明らかにV8のAPIに変更されています。1.何の 'GetCurrent'ありませんし、通常使用して分離株からグローバルを取得' isolate-> GetCurrentContext() - >グローバル() '。 2. 'String :: New()'はありません。通常は 'String :: NewFromUTF8()'が必要です。これが別の答えを正当化するとは思わないでください。 – Stav

1

一部のノードAPIは、OPの公開から変更されています。 node.jsバージョン7.7.1を仮定すると、コードは次の行に沿って何かに変換されます。

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

基本的に、コードは、エンジンからJSONオブジェクトを取得し、そのオブジェクトの関数stringifyへの参照を取得し、それを呼び出します。コードはjavascriptと同じです。

var j = JSON.stringify(obj); 

さらに、v8ベースの代替方法には、JSONクラスを使用することが含まれます。

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