如何将数组编码为包含json的函数?

时间:2014-10-21 07:07:43

标签: javascript php json

当我想生成包含javascript函数的json字符串时,我遇到了一些问题 我正在使用json_encode()函数,它适用于将任何对象/数组编码为json字符串。但是,我想通过javascript函数填充元素值之一 json_encode()将始终将我的函数编码为字符串。如何删除"(引用)?引用"使我的函数成为一个字符串。 这是一个例子:

$var['status']     = "oke";
$var['fnFeedback'] = "function (a,b,c){ return a+c.FnSource; }";

echo json_encode($var);
//then the result
{[status:"oke"],[fnFeedback:"function (a,b,c){ return a+c.FnSource; }"]}
//value of fnFeedback of above json is a string

如何才能使fnFeedback的值成为一个函数?

3 个答案:

答案 0 :(得分:2)

你不能。 JSON表示: J ava S crpt O bject N otation < / em>的。它是对象的所有属性的String值的序列化。函数属性不可序列化。如果将JSON字符串反序列化为Object,则必须将包含该函数的字符串转换为实际的javascript函数(例如,使用evalnew Function)。

See also ...,第5章:

  

JSON值可以是对象,数组,数字,字符串,true,false或   空

答案 1 :(得分:2)

首先,您的示例不是合法的JSON语法。假设它是这样的:

var input = '{"status":"oke","fnFeedback":"function (a,b,c){return a+c.FnSource;}"}';

解决此问题的一种方法是正常解析,然后使用evalfnFeedback属性的值转换为Function对象。但是,使用eval通常是最后的手段(如果您不能完全控制价值eval - ed),那么更不用说极其危险了,这里有更好的方法在解析JSON数据时使用一个小技巧。

诀窍是JSON.parse接受第二个参数,该参数应该是一个接受键/值对并返回结果的函数。将为每个被解析的元素调用此方法。这是将序列化函数字符串转换为实际函数的函数:

var result = JSON.parse(input,
    function(key, value) {
        // if value looks like a function definition, make a function
        if (value 
                && typeof value === "string" 
                && value.substr(0,8) == "function")
        {
            var startBody = value.indexOf('{') + 1;
            var endBody = value.lastIndexOf('}');
            var startArgs = value.indexOf('(') + 1;
            var endArgs = value.indexOf(')');

            return new Function(value.substring(startArgs, endArgs),
                                value.substring(startBody, endBody));
        }
        // else just return the value as is
        return value;
    });

运行此操作后,您可以看到结果:

  

&GT;结果[&#39; fnFeedback&#39;]
  [功能]
  &GT;结果[&#39; fnFeedback&#39]。的toString()
  &#39;函数匿名(a,b,c){\ n返回a + c.FnSource; \ N}&#39;

可以找到有关其工作原理的更详细说明here(从上面进行了调整)。另请参阅this JavaScript gist,了解另一个(也许是更干净的)示例代码,使用相同的想法(我没有测试过)。

答案 2 :(得分:1)

JSON不能直接表示函数体。

鉴于您的JSON转换回JS对象(下面称为myObj),一种可能性是将字符串直接转换为函数,方法是将其包装在括号中(从而将函数声明转换为函数表达式),然后将其传递给eval

var fnFeedback = eval('(' + myObj.fnFeedback + ')';

请注意,使用eval可能存在安全问题 - 请谨慎使用,不要相信第三方间接提供的任何功能机构。使用Function代替更安全,请参阅Ted Hopp后来的回答。