为什么';jquery在发送到asp.net web方法之前,是否将我的数组转换为json字符串?

为什么';jquery在发送到asp.net web方法之前,是否将我的数组转换为json字符串?,asp.net,jquery,serialization,Asp.net,Jquery,Serialization,到目前为止,我只将javascript字符串传递给我的web方法,这些方法通常被解析为GUID。但现在我有了一个接受IList的方法。。。在客户端上,我构建了这个对象数组,然后尝试像这样传递它: $.ajax({ type: 'POST', url: 'personalization.aspx/SetPersonalization', data: "{'backerEntries':" + backerEntries + "}", contentType: 'applicatio

到目前为止,我只将javascript字符串传递给我的web方法,这些方法通常被解析为GUID。但现在我有了一个接受IList的方法。。。在客户端上,我构建了这个对象数组,然后尝试像这样传递它:

$.ajax({
  type: 'POST',
  url: 'personalization.aspx/SetPersonalization',
  data: "{'backerEntries':" + backerEntries + "}",
  contentType: 'application/json; charset=utf-8',
  dataType: 'json',
  success: postcardManager.SetPersonalizationComplete
});
该职位:

{'backerEntries':[object Object],[object Object],[object Object]}
错误响应:

Invalid JSON primitive: object.

出于某种原因,jquery似乎没有将我的数组转换成json字符串?你知道为什么吗?我试着把[]放在后台,{},以及{[]}完全是在绝望中。我是不是漏掉了什么明显的东西

您正在传递的数据已尝试将其作为字符串传递。如果希望jQuery对其进行转换,则将整个对象保留为一个对象,例如

data:{backerEntries: backerEntries }
当然,假设backerEntries是一个数组。jQuery应该对此进行转换,并将其附加到querystring,因为这是它的默认行为。您当前的代码依赖于默认JavaScript行为,默认情况下不会将数组转换为其字符串表示形式

数据:“{'backerEntries':”+backerEntries+“}”

…与…相同

data: "{'backerEntries':" + backerEntries.toString() + "}",

…这几乎是无用的。如果您只想在查询字符串中传递名为“backerEntries”的编码值列表,请使用的建议。如果要对数据进行JSON编码,则获取并调用
JSON.stringify()

,因为您使用的是ASP.NET,所以可以使用内置的ASP.NET AJAX序列化库:

var backerEntriesJson = Sys.Serialization.JavaScriptSerializer.serialize(backerEntries);
然后在jQuery ajax调用中直接传递:

...
data: backerEntriesJson,
...

这是无效的JSON:{'foo':'bar'}

现在不是,过去不是,将来也不会。JSON处理器通常非常宽容,这当然是一种虚假的方便

阅读说明书。字符串被定义为用双引号括起来,不是单引号,不是笑脸字符,不是弯成直角的金属片,不是砖块。没有提到单引号,句号

现在,属性名是JSON字符串。根据定义,它们必须用双引号括起来

有效:{“foo”:“bar”} 有效的“{”foo:100} 有效:{“foo”:true} 有效:{“foo”:[“一”、“二”],“条”:false}

见www.json.org


请参阅www.jsonlint.com

谢谢Shog9。这就是我在谷歌上搜索并已经开始实现的。不幸的是,我的列表不仅仅是字符串列表,它是一个自定义对象列表。这就是为什么我猜jquery没有json字符串。工作顺利。我很惊讶jquery没有内置此功能!jquery没有提供序列化服务ces。既然您已经在使用ASP.NET,而不是添加一个新的库,那么您应该使用ASP.NET ajax框架免费提供的内置序列化例程(请参阅下面我的回答)。这是一个很好的红色标记更正,但是您能回答这个问题吗?