如何解析嵌入式v8中的JSON? [英] How to parse JSON in an embedded v8?
本文介绍了如何解析嵌入式v8中的JSON?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想在我的嵌入式V8应用程序中解析JS,我总是得到一个SIGSEGV。我不知道发生了什么。
I am trying to Parse JS in my embedded V8 application and I get a SIGSEGV always. I am not sure what is happening.
我的代码解析json,
My code to parse json,
v8::Handle<v8::Value> FromJSONString(
v8::Handle<v8::Value> json_string) {
v8::HandleScope scope;
v8::Handle<v8::Context> context = v8::Context::GetCurrent();
v8::Handle<v8::Object> global = context->Global();
v8::Handle<v8::Value> JSON_value = global->Get(v8::String::New("JSON"));
if (!IsObject(JSON_value)) {
return scope.Close(v8::Undefined());
}
v8::Handle<v8::Object> JSON = JSON_value->ToObject();
v8::Handle<v8::Value> JSON_parse_value = JSON->Get(v8::String::New("parse"));
if (JSON_parse_value.IsEmpty() || JSON_parse_value->IsNull() ||
JSON_parse_value->IsUndefined() ||!JSON_parse_value->IsFunction()) {
return scope.Close(v8::Undefined());
}
v8::Handle<v8::Function> JSON_parse =
v8::Handle<v8::Function>::Cast(JSON_parse_value);
return scope.Close(JSON_parse->Call(JSON, 1, &json_string));
}
崩溃的特定网站=>
bool extractSource(std::string* source, std::string& body) {
v8::HandleScope scope; // this is needed and clears the memory
if (body.empty()) {
return false;
}
v8::Handle<v8::Value> value = v8_server_utils::FromJSONString(body);
if (value->IsEmpty()) { // CRASHES HERE.
return false;
}
if (value->IsNull()) {
return false;
}
if (value->IsUndefined()) {
return false;
}
if (!value->IsObject()) {
return false;
}
auto object = value->ToObject();
auto source_key = v8::String::New("source");
if (object.IsEmpty() || object->IsNull() || object->IsUndefined() ||
!object->Has(source_key)) {
return false;
}
auto source_obj = object->Get(source_key);
*source = v8_server_utils::JSStringToCString(source_obj->ToString());
return true;
}
推荐答案
通过API公开:
v8::Local<v8::String> str; // some string
v8::Local<v8::Value> result = v8::JSON::Parse(str);
较新版本的V8提供 EscapableHandleScope
使用从函数返回句柄:
Newer versions of V8 provide EscapableHandleScope
you need to use to return handle from function:
v8::EscapableHandleScope scope(isolate);
return scope.Escape(value);
此
if (value->IsEmpty()) { // CRASHES HERE.
应该
if (value.IsEmpty())
希望这有帮助。
这篇关于如何解析嵌入式v8中的JSON?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文