views:

27

answers:

3

I have a json string like this:

json = "{'run': 'function() { console.log('running...'); }'}"

How do I run that function inside of the json string?

A: 

JSON is not really intended for that, but here seems to be a good example.

Dustin Laine
CouchDB is using this to store map reduce functions in the database. I have to store functions in the database too.
weng
+2  A: 

You're going to have to use the eval() (doc) function. A lot of people have a lot of feelings about this function. JSON is best for transporting data, not functions (see JSON). The functions ought to lay in the script on the page. Also there's a syntax error in your posted code (function is wrapped in single quotes ('), and so is console.log's first parameter). But...

json = "{\"run\":\"function() { console.log('running...'); }\"}"; //Fixed, thanks
obj = JSON.parse(json);
eval(obj.run); //Logs "running..."

Update:

Oh, and I was mistaken. Eval doesn't seem to like anonymous functions. With the revised code, it will parse json into an object with a run property that is a String, with value "function() { console.log('running...'); }". But when you eval(obj.run);, you will get a SyntaxError declaring an unexpected (. Presumably, this is the ( in function ().

So, I can think of two ways of dealing with this:

  1. Remove the anonymous function in your actual JSON string (so, make your PHP forget about function () {), and eval it. This means it will be called as soon as you eval it.
  2. What I think you want, is to be able to evaluate it to an anonymous function, that will be called when you want. So, you could write a wrapper function (you would need to follow option 1 for this as well):

    function returnEval(str) {
        return function () { eval(str); }
    }
    

    This would allow you to call it. So:

    obj = JSON.parse(json);
    obj.run = returnEval(obj.run);
    obj.run(); //Logs "running..."
    

Hope this helps!

clarkf
the second line gave me in Chrome: SyntaxError: Unexpected token ILLEGAL
weng
@weng - Fixed it above. Hope I helped!
clarkf
A: 

This works for me in Firefox:

var json = "{'run': 'function() { console.log(\\'running...\\'); }'}";
eval('var j = ' + json);
eval('var r = ' + j.run);
r();
mellowsoon