[v8-users] Native JSON.parse()?

190 views
Skip to first unread message

Robert Ginda

unread,
Apr 28, 2010, 7:17:46 PM4/28/10
to v8-u...@googlegroups.com
I'm working on a v8 embedding that needs to take a JSON file as a
command line argument. I'd prefer not to Script::Run() it directly,
for the usual reason folks don't want to eval() json. Is there a
native API for JSON.parse()?


Rob.

--
v8-users mailing list
v8-u...@googlegroups.com
http://groups.google.com/group/v8-users

Stephan Beal

unread,
Apr 28, 2010, 7:21:30 PM4/28/10
to v8-u...@googlegroups.com
On Thu, Apr 29, 2010 at 1:17 AM, Robert Ginda <rgi...@chromium.org> wrote:
I'm working on a v8 embedding that needs to take a JSON file as a
command line argument.  I'd prefer not to Script::Run() it directly,
for the usual reason folks don't want to eval() json.  Is there a
native API for JSON.parse()?

You may want to check out the list of implementations near the bottom of the page at:


the only one of those i've used is jsoncpp, which is really simple to use but also has a few incompatibilities with JS/JSON which might annoy or hinder certain users (e.g. properties are stored in lexical sort order, instead of their insertion order, and the default value for a JS var is null instead of undefined (a value the framework doesn't account for at all)).

--
----- stephan beal
http://wanderinghorse.net/home/stephan/

Robert Ginda

unread,
Apr 28, 2010, 7:30:21 PM4/28/10
to v8-u...@googlegroups.com
Thanks for the quick reply, but I was hoping to use v8's native parser.

I imagine worst-case I can get a reference to the context's JSON.parse
function and Function::Call() it, which I'd prefer over adding another
dependency.


Rob.

Stephan Beal

unread,
Apr 28, 2010, 7:46:29 PM4/28/10
to v8-u...@googlegroups.com
On Thu, Apr 29, 2010 at 1:30 AM, Robert Ginda <rgi...@chromium.org> wrote:
Thanks for the quick reply, but I was hoping to use v8's native parser.

I imagine worst-case I can get a reference to the context's JSON.parse
function and Function::Call() it, which I'd prefer over adding another
dependency.

The v8 impl appears to be in parser.cc, as part of the Parser class. It's not in the public API, so if you wanted to use it you'd have to declare the internal types in your code (or import the v8-private headers) and then pray that future changes to v8 do not invalidate the hackery.

On second thought - the internals you'd need from parser.cc are not declared in parser.h, and appear to be private to that file... so good luck!

Ryan Dahl

unread,
Apr 28, 2010, 9:02:30 PM4/28/10
to v8-u...@googlegroups.com
On Wed, Apr 28, 2010 at 4:17 PM, Robert Ginda <rgi...@chromium.org> wrote:
> I'm working on a v8 embedding that needs to take a JSON file as a
> command line argument.  I'd prefer not to Script::Run() it directly,
> for the usual reason folks don't want to eval() json.  Is there a
> native API for JSON.parse()?

Just assign it to some value:

V8::Initialize();
HandleScope handle_scope;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
context->Global()->Set(String::New("s"), String::New(argv[1]));
Local<Script> script =
Script::Compile(String::new("JSON.parse(s);"),
String::New("parse.js"));
Local<Value> result = script->Run();
Reply all
Reply to author
Forward
0 new messages