Sto scrivendo i collegamenti node.js e voglio generare una stringa JSON dalle istanze di v8 :: Object. Voglio farlo in C++. Poiché node.js ha già JSON.stringify
, mi piacerebbe usarlo. Ma non so come accedervi dal codice C++.Accesso a JSON.stringify da node.js Collegamenti C++
9
A
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));
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);
Problemi correlati
- 1. Streaming/Piping Output JSON.stringify in Node.js/Express
- 2. JSON.stringify rispetto a serializzazione
- 3. C++ Accesso a SQL Server da Linux
- 4. Accesso a Swift Extension da Objective-C
- 5. Accesso a un modulo globale node.js
- 6. passando un array a json.stringify
- 7. Accesso a SQLServer con Node.js su Linux
- 8. Node.js su MAC: accesso a un server Web Node.js da un altro computer
- 9. JSON.stringify ritorno []
- 10. Timeout da Node.js a Socket.io
- 11. collegamenti Manipolazione da modello a AngularJS
- 12. JSON.stringify() non fuggire apostrofo
- 13. Accesso a un elenco F # da dentro codice C#
- 14. Accesso a una variabile da un altro script C#
- 15. Spazio tra l'output JSON.stringify
- 16. JSON.stringify oggetti profondi
- 17. Accesso a RequestContext da global.asax
- 18. Accesso a OrientDB da Python
- 19. Accesso a scala.None da Java
- 20. Accesso a iPhone da Windows
- 21. accesso a R da SAS
- 22. JSON.stringify conversione Infinity su null
- 23. JSON.stringify e "\ u2028 \ u2029" controllare?
- 24. jquery equivalente per JSON.stringify
- 25. LocalStorage e JSON.stringify JSON.parse
- 26. Accesso XAML controlla da C# code-behind
- 27. JSON.stringify (oggetto) non corretta
- 28. Accesso a ResourceDictionary da WPF UserControl
- 29. Come connettersi a nethack da Node.js?
- 30. Accesso alla funzione C++ da QML
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