Piszę wiązania node.js i chcę wygenerować ciąg JSON z instancji v8 :: Object. Chcę to zrobić w C++. Ponieważ plik node.js ma już numer JSON.stringify
, chciałbym go użyć. Ale nie wiem, jak uzyskać do niego dostęp z kodu C++.Uzyskiwanie dostępu do pliku JSON.stringify z węzłów node.js C++
9
A
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));
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
- 1. Uzyskiwanie dostępu do ukrytych węzłów w systemie Windows
- 2. Uzyskiwanie dostępu do pliku nagłówkowego
- 3. Uzyskiwanie dostępu do ScrollViewer ListBox z C#
- 4. Uzyskiwanie dostępu do pliku ustawień innego projektu
- 5. Uzyskiwanie dostępu do rozszerzenia Swift z Objective-C
- 6. Uzyskiwanie dostępu do metod z innej klasy w C#
- 7. Uzyskiwanie pliku node.js do odczytu plików w formacie html
- 8. Uzyskiwanie pliku Sails.js do pracy z modułem klastra Node.js
- 9. node.js - Uzyskiwanie dostępu do kodu wyjścia i stderr polecenia systemowego
- 10. Java: Uzyskiwanie dostępu do pliku z serwera FTP
- 11. Uzyskiwanie dostępu do modelu z pliku js.erb podczas wstępnej kompilacji
- 12. Uzyskiwanie dostępu do pliku z kolejki plików w przepływie Tensor
- 13. uzyskiwanie dostępu do rekordów OCaml
- 14. Uzyskiwanie dostępu do Web.config z innego projektu
- 15. Uzyskiwanie dostępu do ResourceDictionary z WPF UserControl
- 16. Uzyskiwanie określonych wartości węzłów z dokumentu XML
- 17. Uzyskiwanie dostępu do właściwości w pliku prepareForSegue elementu UIViewController
- 18. C#: Uzyskiwanie dostępu do obrazu dodanego do folderu projektu
- 19. Uzyskiwanie dostępu do obiektów z innego procesu
- 20. Uzyskiwanie dostępu do modelu z szablonu
- 21. Uzyskiwanie dostępu do komponentów .NET z Powershell
- 22. Uzyskiwanie dostępu do metadanych z mp3 Python
- 23. Uzyskiwanie dostępu do FacesContext z usługi WWW
- 24. Uzyskiwanie dostępu do indeksu z drzewa wyrażeń
- 25. Uzyskiwanie dostępu do pól z obiektu Proxied
- 26. Uzyskiwanie dostępu do UITabBarController z UIVIewController
- 27. Uzyskiwanie adresu MAC klienta na pliku node.js
- 28. Uzyskiwanie dostępu do zasobów JAR
- 29. Uzyskiwanie dostępu do ustawień poczty SMTP z pliku Web.Config przy użyciu C#
- 30. Uzyskiwanie dostępu do elementów JSON
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