将对象数据提交到服务器时,为什么必须调用JSON.stringify?

Jos*_*iel 1 javascript jquery asp.net-web-api

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

我想知道为什么这是必要的。我以为我还没有遇到过使它成为必需或至少可取的东西。

目前,使用这些jQuery ajax选项将所需的任何数据发送到服务器都没有问题:

        cache: false,
        traditional: true,
        type: 'POST',
Run Code Online (Sandbox Code Playgroud)

这是示例JS对象和相应的POST并绑定到ApiController操作方法的服务器端C#模型对象。

//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){
    ...
Run Code Online (Sandbox Code Playgroud)

我想念什么?

Joh*_*rak 6

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

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

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

这使程序员可以对对象进行编码以查询字符串,但要注意以下几点:

  • 每个值都是一个字符串
  • 数组和带有数字键的对象之间没有区别。PHP不在乎,但是某些服务器可能会。
  • 无法对空对象或数组进行编码。对于传统形式,这会导致缺少空数组。PHP确实在乎。jQuery通过发送一个空字符串来解决该问题。
  • 这是极其低效的,因为必须为每个值重复路径:checkboxes[]=ch1&checkboxes[]=ch2&...vs。checkboxes=["ch1","ch2",...]
  • 您必须了解PHP不喜欢的目标平台traditional(或诉诸于postVars.get("names[]")这样做的服务器)
  • 有些服务器根本不了解这种编码。

使用JSON,

  • 您可以编码数字,字符串null,...
  • 数组,对象
  • 空数组和对象很容易表示。您不必仅仅因为每个数组和对象可能为空而测试它们的存在。
  • 不会重复使用任何键,因此您不必将键短
  • 毫无疑问如何用自动键表示数组;JSON不管发送到哪里都对相同的结构进行编码。
  • 可以使用任何语言解析JSON。许多语言都内置了JSON支持,其余语言可以获取库
  • 您只需要在服务器和客户端上多写一行即可。

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