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

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

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

post:

 {'backerEntries':[object Object],[object Object],[object Object]} 

错误响应:

 Invalid JSON primitive: object. 

出于某种原因,jquery似乎没有将我的数组转换为json字符串? 有什么想法吗? 我试着在backerEntries和{}周围放置[],以及{[]}只是绝望。 我错过了一些明显的东西吗?

数据:“{‘backerEntries’:”+ backerEntries +“}”,

..是相同的

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

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

您传递给您的数据正在尝试将其作为字符串传递给您。 如果你想让jQuery转换它,那就把整个东西留作一个对象,比如说

 data:{backerEntries: backerEntries } 

当然假设backerEntries是一个数组。 jQuery应该转换它并将它附加到查询字符串,因为这是它的默认行为。 您当前的代码依赖于默认的JavaScript行为,默认情况下不会将数组转换为其字符串表示forms。

由于您使用的是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“:[”one“,”two“],”bar“:假的

见www.json.org

见www.jsonlint.com