Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在向服务器提交对象数据时需要调用JSON.stringify?_Javascript_Jquery_Asp.net Web Api - Fatal编程技术网

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

Javascript 为什么在向服务器提交对象数据时需要调用JSON.stringify?,javascript,jquery,asp.net-web-api,Javascript,Jquery,Asp.net Web Api,我正在使用Knockout.js和ASP.NET web ApicController完成一个新项目。我看到的许多示例在将数据发布到服务器之前执行一些手动JSON序列化。此外,请求内容类型同样经常设置为application/json 我想知道为什么这是必要的。我假设有一些我还没有遇到的东西,使这要么是必需的,要么至少是更可取的 目前,我使用以下jQuery ajax选项向服务器发送所需的任何数据都没有问题: cache: false, traditional:

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

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

目前,我使用以下jQuery ajax选项向服务器发送所需的任何数据都没有问题:

        cache: false,
        traditional: true,
        type: 'POST',
下面是示例JS对象和相应的服务器端C模型对象,它们可以发布并绑定到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']作为数组读取。如果查询字符串中重复了一个键,那么让我们构建一个数组

如果要支持键名称[]=1,为什么不支持名称[a][b][c]=1?服务器知道他们应该做什么:分配名称={a:{b:{c:1}}

这使程序员能够对对象进行编码以查询字符串,并附带一些捕获:

每个值都是一个字符串 数组和带有数字键的对象之间没有区别。PHP不在乎,但有些服务器可能会在乎。 没有办法对空对象或数组进行编码。对于传统表单,这会导致缺少空数组。PHP确实关心。JQuery通过发送一个空字符串来解决这个问题。 这是非常低效的,因为必须为每个值重复路径:复选框[]=ch1和复选框[]=ch2&。。。vs.复选框=[ch1,ch2,…] 您必须了解目标平台,因为PHP不喜欢传统的,或者在需要的服务器上读取postVars.getnames[] 有些服务器根本不理解这种编码。 使用JSON

您可以对数字、字符串、null等进行编码。。。 ... 数组、对象。。。 空数组和对象很容易表示。您不必仅仅因为每个数组和对象可能为空就测试它们是否存在。 没有钥匙是重复的,所以你不需要保持你的钥匙短 如何用自动键表示数组没有混淆;JSON编码相同的结构,无论它发送到哪里。 任何语言都可以解析JSON。很多语言都内置了JSON支持。 您只需在服务器和客户端上多写一行。
简言之,如果只需要对键值对进行编码,这就是普通GET或POST所擅长的。如果需要对数组进行编码,JSON绝对值得考虑。如果您需要更复杂的内容,JSON是某些服务器的唯一方式。

过去,GET和POST只能发送键值对,并且键值应该是唯一的

当PHP出现时,它定义了一个键是否包含方括号,让我们构建一个数组。这使程序员能够调用他们的复选框name=chkbox[],让表单正常提交,并将$_POST['chkbox']作为数组读取。如果查询字符串中重复了一个键,那么让我们构建一个数组

如果要支持键名称[]=1,为什么不支持名称[a][b][c]=1?服务器知道他们应该做什么:分配名称={a:{b:{c:1}}

这使程序员能够对对象进行编码以查询字符串,并附带一些捕获:

每个值都是一个字符串 数组和带有数字键的对象之间没有区别。PHP不在乎,但有些服务器可能会在乎。 没有办法对空对象或数组进行编码。对于传统表单,这会导致缺少空数组。PHP确实关心。JQuery通过发送一个空字符串来解决这个问题。 这是非常低效的,因为必须为每个值重复路径:复选框[]=ch1和复选框[]=ch2&。。。vs.复选框=[ch1,ch2,…] 您必须了解目标平台,因为PHP不喜欢传统的,或者在需要的服务器上读取postVars.getnames[] 有些服务器根本不理解这种编码。 使用JSON

您可以对数字、字符串、null等进行编码。。。 ... 数组、对象。。。 空数组和对象很容易表示。您不必仅仅因为每个数组和对象可能为空就测试它们是否存在。 没有钥匙是重复的,所以你不需要保持你的钥匙短 如何用自动键表示数组没有混淆;JSON编码相同的结构,无论它发送到哪里。 任何语言都可以解析JSON。很多语言都内置了JSON支持。 您只需在服务器和客户端上多写一行。 简言之,如果只需要对键值对进行编码,这就是普通GET或POST所擅长的。如果需要对数组进行编码,可以使用JSON
这绝对值得考虑。如果您需要更复杂的内容,JSON是某些服务器的唯一选择。

我想这是因为使用传统的POST只能发送简单的名称-值对-所有内容在到达服务器时看起来都像一个字符串。使用JSON可以发送更复杂的对象。JSON.stringify在哪里?@Blazemonger,是的,当然-这很有意义。因此,嵌套对象将以类似JavaScript版本的ToString的形式传递给服务器,例如[object]。有空的时候请把答案贴出来。@JanDvorak,恐怕你不明白我说的话meant@Alexander,我根本没有调用JSON.stringify。我所做的一切都没有必要。我发布了这个问题,试图弄清楚它为什么如此受欢迎。我完全忽略了使用JSON和简单表单值的区别——我想到了一些关于森林和树的东西:我想这是因为使用传统的POST只能发送简单的名称-值对——所有东西在到达服务器时看起来都像一个字符串。使用JSON可以发送更复杂的对象。JSON.stringify在哪里?@Blazemonger,是的,当然-这很有意义。因此,嵌套对象将以类似JavaScript版本的ToString的形式传递给服务器,例如[object]。有空的时候请把答案贴出来。@JanDvorak,恐怕你不明白我说的话meant@Alexander,我根本没有调用JSON.stringify。我所做的一切都没有必要。我发布了这个问题,试图弄清楚它为什么如此受欢迎。我完全忽略了使用JSON和简单表单值的区别——我想到了一些关于森林和树木的东西:+1,回答得很好。然而,我并不真正理解只有树状结构才能被编码。除此之外,JSON也是如此,这对几乎所有编码都适用吗?树可以很容易地展平成所需的线性结构,对于任何更复杂的东西,你都需要非常特殊的语义。@Bergi你是对的;这一点毫无用处。删除它。+1,回答得很好。然而,我并不真正理解只有树状结构才能被编码。除此之外,JSON也是如此,这对几乎所有编码都适用吗?树可以很容易地展平成所需的线性结构,对于任何更复杂的东西,你都需要非常特殊的语义。@Bergi你是对的;这一点毫无用处。移除它。