Tôi đang tạo bảng điều khiển dựa trên vỏ v8, tôi lấy mã mẫu có came v8 và nó hoạt động rất tốt, nhưng tôi đang cố chuyển đổi đối tượng v8 :: thành phiên bản chuỗi của nó (json) nhưng didnt findout một cách để làm điều đó.Sử dụng stringify từ vỏ v8
Dưới đây là mẫu mã của tôi bên trong shell.cc:
v8::Handle test(const v8::Arguments& args) {
v8::HandleScope handle_scope;
const char* json;
v8::String::Utf8Value strJson(args[0]);
printf(ToCString(json));
if (args[0]->IsObject()) {
printf("it's an object\n");
}
return v8::String::New("");
}
Tại vỏ Tôi tạo ra một tập tin test.js với điều này:
var a = { name: 'John' };
test(a);
và tôi có được điều này sau khi thực hiện js trong vòng vỏ console:
[object Object]
It's an object
những gì tôi muốn là:
{ "name": "John" }
nếu tôi thay đổi mã js để:
var a = { name: 'John'}
test(JSON.stringify(a));
nó hoạt động rất tốt, nhưng tôi không muốn người dùng cần phải biết làm thế nào để phân tích một biến javascript vào json, và tôi không muốn để kiểm tra mọi đầu vào đơn lẻ tại đối tượng và phân tích cú pháp theo cách thủ công.
Có cách nào để thực hiện cùng một lệnh trong mã shell.cc trong C không? cái gì đó như:
v8::Handle<v8::String> temp = JSON.parse(arg[0]);
cập nhật: Đây là cách tôi xử lý này, nhưng tôi muốn có một cách sạch hơn để làm điều tương tự:
const char* toJson(const v8::Local<v8::Object>& obj) {
std::stringstream ss;
ss << "{";
v8::Local<v8::Array> propertyNames = obj->GetPropertyNames();
for (int x = 0; x < propertyNames->Length(); x++) {
if (x != 0) {
ss << ", ";
}
v8::String::Utf8Value name(propertyNames->Get(x));
ss << "\"" << ToCString(name) << "\":";
v8::Local<v8::Value> val = obj->GetInternalField(x);
if (val->IsObject()) {
ss << toJson(val->ToObject());
} else {
ss << "\"" << ToCString(v8::String::Utf8Value(val)) << "\"";
}
}
ss << "}";
const char* result = ss.str().c_str();
return result;
}
v8::Handle test(const v8::Arguments& args) {
v8::HandleScope handle_scope;
const char* json;
v8::String::Utf8Value strJson(args[0]);
if (args[0]->IsObject()) {
char* json = toJson(args[0]);
// ...
// Some operations with the json
// ...
}
return v8::String::New("");
}