将JSON字符串数组转为List:Ajax传参至C#控制器遇反斜杠解析问题
我太懂你这糟心的情况了——用JSON.stringify处理后的数组传到C#控制器,结果变成了带反斜杠的转义字符串,本来想遍历每个国家,结果foreach完全没法正常工作。本质原因是C#把这个转义后的内容当成了单个完整字符串,而不是数组对象,自然没法直接迭代。下面给你两种实用的解决方案:
方案一:让jQuery自动处理序列化(推荐)
其实根本没必要手动用JSON.stringify,jQuery的Ajax可以自动帮你把JS数组序列化成正确的JSON格式,直接让控制器接收强类型的List<string>就行,省心又不容易出错:
前端Ajax代码:
var countryArray = ["Germany", "Brazil", "United States"]; $.ajax({ url: "/YourController/YourAction", type: "POST", contentType: "application/json; charset=utf-8", // 关键:告诉后端这是JSON数据 data: JSON.stringify(countryArray), // 配合contentType,这里的stringify是正确打开方式 success: function(response) { // 处理返回结果 } });
如果你的jQuery版本较新,甚至可以直接传数组(不过保险起见还是保留stringify和contentType,兼容性更好):
data: countryArray,
后端C#控制器代码:
using System.Collections.Generic; using System.Web.Mvc; // ASP.NET Core用Microsoft.AspNetCore.Mvc public class YourController : Controller { [HttpPost] public ActionResult YourAction(List<string> countryList) { foreach (var cntry in countryList) { // 这里就能正常遍历每个国家了 // 比如做一些数据处理:Logger.LogInformation($"当前国家:{cntry}"); } return Json(new { success = true }); } }
这样控制器会自动把前端传来的JSON数组绑定到List<string>上,完全不需要手动解析。
方案二:手动解析转义后的字符串(特殊场景下用)
如果因为某些限制,你只能传递转义后的字符串(比如后端接收参数必须是string类型),那可以用Json.NET(Newtonsoft.Json)来手动反序列化:
后端C#代码:
先确保你的项目安装了Newtonsoft.Json NuGet包,然后:
using Newtonsoft.Json; using System.Collections.Generic; using System.Web.Mvc; public class YourController : Controller { [HttpPost] public ActionResult YourAction(string countryList) { // 自动处理转义字符,把字符串还原成List<string> List<string> countries = JsonConvert.DeserializeObject<List<string>>(countryList); foreach (var cntry in countries) { // 正常执行你的遍历逻辑 } return Json(new { success = true }); } }
JsonConvert.DeserializeObject会自动识别转义的双引号,把带反斜杠的字符串还原成正常的数组。
为什么会出现反斜杠?
简单来说:当你手动JSON.stringify后,字符串里的双引号会被转义成\";如果前端没设置正确的contentType,后端会把整个JSON字符串当成普通的字符串参数接收,所以就会看到带反斜杠的内容。设置contentType: "application/json"后,后端会识别出这是JSON数据,自动完成模型绑定,转义问题就消失了。
内容的提问来源于stack exchange,提问作者Kurkula

