gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:08:32 28 4
gpt4 key购买 nike

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

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

目前,使用这些 jQuery ajax 选项,我可以毫无问题地将我想要的任何数据发送到服务器:

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

这是示例 JS 对象和相应的服务器端 C# 模型对象,它们可以 POST 并绑定(bind)到 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){
...

我错过了什么?

最佳答案

从历史上看,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&... vs. checkboxes=["ch1","ch2 ",...]
  • 您必须知道目标平台,因为 PHP 不喜欢 traditional(或求助于从服务器上的 postVars.get("names[]") 读取)做)
  • 一些服务器根本不理解这种编码。

使用 JSON,

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

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

关于javascript - 为什么向服务器提交对象数据时需要调用JSON.stringify?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13981255/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com