【问题标题】:Why is it necessary to call JSON.stringify when submitting object data to server?为什么在向服务器提交对象数据时需要调用 JSON.stringify?
【发布时间】:2012-12-21 07:37:05
【问题描述】:

我正在使用 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){
    ...

我错过了什么?

【问题讨论】:

  • 我想这是因为使用传统的POST 只能发送简单的名称-值对——所有东西在到达服务器时看起来就像一个字符串。使用 JSON 可以让您发送更复杂的对象。
  • JSON.stringify 在哪里?
  • @Blazemonger,是的,当然 - 这是有道理的。因此,嵌套对象将作为 JavaScript 的 ToString() 版本(例如 [object Object])传递给服务器。请在您有时间的时候发布作为答案。
  • @JanDvorak,恐怕你没明白我的意思
  • @Alexander,我根本没有调用 JSON.stringify。这对我正在做的事情没有必要。我发布了这个问题,试图弄清楚它为什么如此受欢迎。我完全忽略了使用 JSON 与简单表单值的意义——我想到了一些关于森林和树木的东西 :)

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


【解决方案1】:

从历史上看,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 是使用某些服务器的唯一方法。

【讨论】:

  • +1,很好的答案。但是,我不太了解“只能编码树状结构”。除此之外,它对于 JSON 是一样的,难道几乎所有的编码都不是这样吗?树可以很容易地展平为所需的线性结构,对于更复杂的一切,您需要非常特殊的语义。
  • @Bergi 你是对的;那一点一点用都没有。删除它。
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多