使用jQuery获取带有函数的JSON

时间:2011-01-13 17:56:08

标签: javascript jquery json

在我的.js文件的根目录中,我声明:

var Doe = {
            "foo": "The quick brown fox jumps over the lazy dog.",
            "bar": "ABCDEFG",
            "baz": [52, 97],
            "testfunc": function(){alert('json function');}
           }

在我的HTML中:

<a id="lele" href="javascript:void(0)" onclick="Doe.testfunc()">Doe</a>

当我单击它时,它可以工作,所以我知道可以将函数放在JSON对象中。

现在,在我声明的.js的根目录中:

$.getJSON("~/rule/2", function(data) {
    alert("2: " + data.foo);
    data.testfunc();
});

服务器正在返回该URL:

 context.Response.ContentType = "application/json";
 context.Response.Output.Write(@"{
                     ""foo"": ""The quick brown fox jumps over the lazy dog."",
                     ""bar"": ""ABCDEFG"",
                     ""baz"": [52, 97],
                     ""testfunc"": function(){alert('json function');}  
                                 }");
  context.Response.Flush();

但没有任何反应:(显然是因为如果有错误,.getJSON将无声地失败。但是,如果我删除有关该功能的行:

$.getJSON("~/rule/2", function(data) {
    alert("2: " + data.foo);
});

 context.Response.Output.Write(@"{
                     ""foo"": ""The quick brown fox jumps over the lazy dog."",
                     ""bar"": ""ABCDEFG"",
                     ""baz"": [52, 97]}");

然后它工作,弹出一个警告“foo”属性的内容。

该功能有什么问题? :(在我将一个函数放入JSON对象的那一刻,jQuery失败了。

亲切的问候。

3 个答案:

答案 0 :(得分:6)

您没有JSON对象。

您有一个对象文字。函数不能是JSON字符串的值。

JSON只是对象文字语法的子集。可能的值有:

values http://json.org/value.gif

详细了解json.org

这是JavaScript对象:

var foo = {bar: 42}

这是一个JSON字符串:

var foo = '{"bar": 42}';

另见JavaScript, JSON objects and object literal notation

更新:要返回并执行JavaScript,您可以执行以下操作:

您可以返回纯JavaScript,例如

context.Response.ContentType = "text/javascript";
context.Response.Output.Write(@"
 function testfunc(){
     alert('json function')
 };
 testfunc();
");

并将$.ajaxdataType: 'script'

一起使用
$.ajax({
    url: "~/rule/2",
    dataType: 'script',
    success: function(data) {}
});

DEMO

您还可以使用以下函数定义JavaScript对象:

context.Response.ContentType = "text/javascript";
context.Response.Output.Write(@"
     var obj = {
         bar: function(){alert(42);}
     }
     yourHandler(obj);
");

您只需要一个名为yourHandler的全局函数(当然仍然使用ajax调用dataType: script)。

这可能是最接近你想要的东西。不同之处在于,您不返回JSON,而是返回JavaScript,并且您不处理success回调中的对象,而是处理另一个函数,该函数必须从您发送的JS中调用。 / p>

查看另一个DEMO

答案 1 :(得分:4)

不可能将函数放在JSON对象中。可以将函数放在JavaScript对象中,这是您在第一个片段中演示的内容。

答案 2 :(得分:3)

您可以将函数体的字符串表示只放在您发送的JSON中,然后将该数据提供给Function构造函数。

示例: http://jsfiddle.net/m8PQY/1/

var myJSON = '{"func":"{alert(\'json function\');}"}';

var obj = $.parseJSON( myJSON );

var myFunc = new Function( obj.func );

myFunc();

如果您是要发送的代码的作者,显然您只想这样做。