如何分析 WCF 数据合约对象创建的 JSON

How to parse JSON created by WCF DataContract object

本文关键字:对象 创建 JSON 数据 WCF      更新时间:2023-09-26

我有一个用 [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 并将它们扔到警报框中......

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

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

根据您获取数据的方式(库?自定义代码?),您很可能必须首先将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中的状态,尽管如果那里也有等效的工具,我不会感到惊讶。