JSON包装我的对象的奇怪行为

时间:2013-07-12 16:53:00

标签: jquery json

我正在将以下帖子发送到我的服务器,

$.ajax({
    url: url,
    data: JSON.stringify({ SecretKey: e.Code, CommentId: e.Id, Direction: direction, VoteType:1}),
    type: "POST",
    contentType: "application/json;charset=utf-8",
});

请求发布时,如下所示:

{"Direction":{"Id":1,"Code":"1234-5678-9012","Description":"This is 1 comment."},"VoteType":"1"}

为什么Direction包裹元素?注意VoteType不受影响? VoteType与其他变量之间的唯一区别是VoteType是一个文字值 - 而不是引用对象。

完整型号,万一有帮助:

var model = {
    Id: ko.observable(0),
    Code: ko.observable(""),
    Description: ko.observable(""),
    Comments: ko.observableArray(),
    vote: function (e, direction) {
    $.ajax({
        url: url,
        data: { SecretKey: e.Code, CommentId: e.Id, Direction: direction, VoteType:1},
        type: "POST",
        contentType: "application/json;charset=utf-8",
    });
    },
    secretVote: function (e, direction) {
        $.ajax({
            url: url,
            data: { SecretKey: e.Code, Direction: direction, VoteType:0},
            type: "POST",
            contentType: "application/json;charset=utf-8",
        });
    },
    comment: sendComment
}

2 个答案:

答案 0 :(得分:1)

当您致电JSON.stringify时,它会尝试序列化所有内容。 description(由键Description标识)指向具有内部属性的复杂对象,因此JSON.stringify会将其序列化为JSON。 VoteType是一个密钥,因此将序列化为VoteType

另外,您没有看到SecretKeyCommentId的原因是它们是undefined,因此不会被JSON.stringify序列化。

总而言之,这与键的有关,而不是键本身。在第一种情况下,Direction引用复杂对象,而在第二种情况下VoteType引用整数。

另一方面,您无需使用JSON.stringify序列化数据; jQuery会为你做到这一点。

答案 1 :(得分:0)

此:

  

JSON.stringify({SecretKey:e.Code,CommentId:e.Id,Direction:direction,VoteType:1})

可以屈服:

  

{“Direction”:{“Id”:1,“Code”:“1234-5678-9012”,“Description”:“这是1条评论。”},“VoteType”:“1”}

如果您的e.Codee.Id未定义(SecretKeyCommentId字段已删除)且direction对象为:

  

{“Id”:1,“Code”:“1234-5678-9012”,“Description”:“这是1条评论。”}``