node.jsバインディングを作成していますが、v8 :: ObjectインスタンスからJSON文字列を生成したいとします。私はC++でそれをやりたいnode.jsには既にJSON.stringify
があるので、私はそれを使いたいと思います。しかし、私はC++コードからアクセスする方法を知らない。node.jsからJSON.stringifyにアクセスするC++バインディング
9
A
答えて
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));
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);
関連する問題
- 1. Node.js/ExpressでのJSON.stringify出力のストリーミング/パイプ
- 2. MAC上のNode.js:別のコンピュータからNode.js Webサーバーにアクセスする
- 3. JSON.stringify jQuery 1.4.4から1.5.2へ
- 4. タイプコンバータからのバインディングへのアクセス?
- 5. RhinoのネイティブJSON.Stringify Javaへのアクセス
- 6. Node.jsからOpenSSLにアクセスするための異なるアプローチ
- 7. JSON.stringify
- 8. Node.jsからAUTH NTLMを使用してSMTPサーバーにアクセスする
- 9. C++コードからAzureストレージテーブルにアクセスする
- 10. C#、クラスから変数にアクセスする?
- 11. letバインディングでx.GetType()にアクセスする
- 12. C++からMySQLデータベースにアクセス
- 13. Rubyの異なるバインディングからのローカル変数へのアクセス
- 14. JSON.stringifyは
- 15. JSON.stringifyストリング
- 16. Node.jsアプリケーションからのダイレクトURLアクセスを防止する
- 17. JSON.stringifyを使用してJSON配列にアクセスできない
- 18. node.jsでnpmを使用した後にクライアントからunderscore.jsにアクセス
- 19. JSON.stringifyからデータをデコードするにはどうすればいいですか?
- 20. json.stringifyに配列を渡す
- 21. DevModeのJSON.stringify(jso)から '__gwt_ObjectId'を除外する
- 22. Ubuntuの外部IPからNode.jsにアクセスできない
- 23. AndroidエミュレータからローカルVirtualBox上のNode.jsにアクセス
- 24. 外部からnode.jsにアクセスできない
- 25. node.jsからnode.jsサーバーにファイルを送信
- 26. ダーツのコレクションをJSON.stringifyするには
- 27. 別のファイルからC++のextern "C"変数にアクセスする
- 28. DataTemplateからのバインディング?
- 29. zeromqとc#バインディング
- 30. C++/MATLAB Mexバインディング
いくつかのものは、明らかにV8のAPIに変更されています。1.何の 'GetCurrent'ありませんし、通常使用して分離株からグローバルを取得' isolate-> GetCurrentContext() - >グローバル() '。 2. 'String :: New()'はありません。通常は 'String :: NewFromUTF8()'が必要です。これが別の答えを正当化するとは思わないでください。 – Stav