为什么在向服务器提交对象数据时需要调用JSON.stringify?

时间:2012-12-20 22:02:13

标签: javascript jquery asp.net-web-api

我正在使用Knockout.js和ASP.NET web ApiController完成一个新项目。我看到的许多示例在将数据发布到服务器之前执行了一些手动JSON序列化。此外,请求内容类型通常也设置为“application / json”。

我想知道为什么这是必要的。我假设有一些我尚未遇到过的东西要么是必需的,要么至少是优选的。

目前,我在使用这些jQuery ajax选项向服务器发送任何我想要的数据时没有问题:

        cache: false,
        traditional: true,
        type: 'POST',

这是一个示例JS对象和相应的服务器端C#模型对象,它可以很好地POST和绑定到ApiController动作方法。

//JS object
var requestDataObject = {
    accountId: vm.accountId,
    range: [1, "a'b\"c", 3],
    start: new Date(2012, 12, 12)
};

//C# model object
public class RequestData
{
    public int AccountId { get; set; }
    public string[] Range { get; set; }
    public DateTime Start { get; set; }
}

//Action method signature
[HttpPost]
public HttpResponseMessage GetAccountUsage(RequestData requestData){
    ...

我错过了什么?

1 个答案:

答案 0 :(得分:4)

历史上,GET(以及随后的POST)只能发送键值对,键应该是唯一的。

当PHP出现时,它定义“如果一个键包含方括号,让我们构建一个数组”。这使程序员可以调用他们的复选框name="chkbox[]",让表单正常提交,并将$_POST['chkbox']作为数组读取。定义了一些其他服务器语言,“如果在查询字符串中重复一个键,让我们构建一个数组”。

如果要支持密钥names[]=1,为什么不names[a][b][c]=1?服务器知道应该做什么:分配names = {a:{b:{c:"1"}}}

这使程序员能够编码对象以查询字符串,只需捕获一些:

  • 每个值都是一个字符串
  • 使用数字键在数组和对象之间没有区别。 PHP并不关心,但有些服务器可能会这样。
  • 无法对空对象或数组进行编码。使用传统表单时,会导致缺少空数组。 PHP确实在乎。 JQuery通过发送空字符串来解决这个问题。
  • 由于必须为每个值重复路径,因此效率非常低:checkboxes[]=ch1&checkboxes[]=ch2&...checkboxes=["ch1","ch2",...]
  • 你必须知道目标平台,因为PHP不喜欢traditional(或者在服务器上求助于postVars.get("names[]")
  • 有些服务器根本不理解这种编码。

使用JSON,

  • 您可以对数字,字符串,null,...
  • 进行编码
  • ...数组,对象......
  • 空数组和对象很容易表示。您不必仅仅因为它可能是空的来测试每个数组和对象的存在。
  • 没有钥匙重复,所以你不需要保持你的钥匙短。
  • 如何用自动键表示数组并不困惑;无论发送到何处,JSON都会对相同的结构进行编码。
  • 可以使用任何语言解析JSON。许多语言都内置了JSON支持,the rest can fetch a library
  • 您只需在服务器和客户端上再写一行。

简而言之,如果您只需要对键值对进行编码,那就是普通的GET或POST擅长的。如果你需要编码数组,JSON绝对值得考虑。如果您需要更复杂的东西,JSON是使用某些服务器的唯一方法。