如何解析由WCF DataContract对象创建的JSON

时间:2011-05-18 16:35:42

标签: javascript jquery .net wcf

我有一个用[DataContract]属性修饰的对象,我的WCF服务将其返回为JSON,如下所示:

{"GetCommentsByPostResult":[{"CommentCreated":"\/Date(1305736030505+0100)\/","CommentText":"Comment 1"},{"CommentCreated":"\/Date(1305736030505+0100)\/","CommentText":"Comment 2"},{"CommentCreated":"\/Date(1305736030505+0100)\/","CommentText":"Comment 2"}]});

我试图用这个jQuery代码遍历CommentCreated:

$(data).each(function () 
{
     alert(this.CommentCreated);
});

但我得到的是一个警告框,其中包含'未定义',因此我将其更改为:

 $(data).each(function () {

         $(this.GetCommentsByPostResult).each(function () {

                      alert(this.GetCommentsByPostResult);
         });

 });

但仍然无效。我想要做的是迭代CommentCreated并将它们扔到一个警告框....

2 个答案:

答案 0 :(得分:3)

我不确定,但在调用this时,我认为each不是当前元素。另外,为什么要使用jQuery函数包装data变量? jQuery集合用于DOM元素。

$.each(data.GetCommentsByPostResult, function (e) {
    alert(e.CommentCreated);
});

答案 1 :(得分:0)

根据您获取数据的方式(库?自定义代码?),您很可能必须首先将JSON字符串转换为实际的JavaScript对象。许多浏览器都有内置的方法来执行此操作,但您可能需要利用第三方库来利用那些没有开箱即用支持的库。我建议使用JSON-js,因为它遵循与某些浏览器中内置的语法相同的语法。

var obj = JSON.parse(data);

拥有此对象后,您现在可以使用标准JavaScript点或括号表示法访问数据:

var comments = obj.GetCommentsByPostResult; // or...
var comments = obj['GetCommentsByPostResult'];

这两行是等价的。要迭代评论,您可以尝试:

$.each(obj.GetCommentsByPostResult, function (e) {
    alert(e.CommentCreated);
});

另外,我建议使用console.log()而不是alert(),以及支持检查已记录对象的浏览器。这将是具有Firebug扩展的FireFox,或带有开发人员工具的Chrome(Ctrl-Shift-J激活)。不确定IE9中此类工具的状态,但如果有同等工具,我也不会感到惊讶。