当我想生成包含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的值成为一个函数?
答案 0 :(得分:2)
你不能。 JSON表示: J ava S crpt O bject N otation < / em>的。它是对象的所有属性的String
值的序列化。函数属性不可序列化。如果将JSON字符串反序列化为Object
,则必须将包含该函数的字符串转换为实际的javascript函数(例如,使用eval
或new Function
)。
See also ...,第5章:
JSON值可以是对象,数组,数字,字符串,true,false或 空
答案 1 :(得分:2)
首先,您的示例不是合法的JSON语法。假设它是这样的:
var input = '{"status":"oke","fnFeedback":"function (a,b,c){return a+c.FnSource;}"}';
解决此问题的一种方法是正常解析,然后使用eval
将fnFeedback
属性的值转换为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后来的回答。