ASP.NET中如何反序列化JSON对象?Ajax传参后端无法解析
解决Ajax传数组到ASP.NET后端无法反序列化的问题
我来帮你搞定这个问题,咱们一步步拆解问题所在,然后给出具体的解决方案:
问题根源
你现在遇到的核心问题是前端传递数据的方式错误:直接把数组demodata拼接到字符串里,导致后端收到的是"[object Object]"——这是因为JavaScript里直接把对象/数组转成字符串时,默认就会输出这个内容,根本不是有效的JSON格式,后端自然没法反序列化。
另外,如果你是想获取下拉框的选项数据,当前的$("#submitlistbox2").each()遍历的是下拉框本身,不是里面的option元素,这也会导致你收集的数据不对。
解决方案步骤
1. 修正前端Ajax代码,正确序列化数据
把前端的data部分改成用JSON.stringify()来序列化整个请求对象,同时修正下拉框选项的遍历方式:
responseData2() { var demodata = []; // 遍历下拉框的所有option元素,而不是下拉框本身 $("#submitlistbox2 option").each(function () { var data = $(this).text() + " " + $(this).val() + "\n"; demodata.push({ var_name_data: data }); }); $.ajax({ url: "你的页面路径.aspx/Details4", // 确保这里是正确的WebMethod路径,比如当前页面的路径加方法名 type: "POST", contentType: "application/json; charset=utf-8", cache: false, // 用JSON.stringify把对象序列化为标准JSON字符串 data: JSON.stringify({ selectedJobSheet: demodata }), success: function (data) { var result = $.parseJSON(data.d); console.log("返回数据:", result); alert("请求成功"); }, error: function (response) { console.error("请求出错:", response); alert("请求出错,请查看控制台详情"); } }); }
2. 后端修改参数类型,自动反序列化数据
后端原来的参数是string类型,现在需要改成能接收数组的类型,推荐两种方式:
方式一:定义实体类接收(更规范)
先定义一个和前端对象结构对应的实体类:
// 放在你的页面类或者单独的实体文件里 public class JobSheetData { public string var_name_data { get; set; } }
然后修改WebMethod的参数为List<JobSheetData>,ASP.NET会自动帮你把JSON反序列化为集合:
[WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public static object Details4(List<JobSheetData> selectedJobSheet) { try { // 现在你可以直接遍历selectedJobSheet,拿到每个元素的var_name_data foreach (var item in selectedJobSheet) { string itemData = item.var_name_data; // 这里可以添加你的业务逻辑,比如把数据存入数据库等 } // 你原来的数据库查询逻辑保持不变 string constr = ConfigurationManager.ConnectionStrings["Constr"].ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { using (SqlCommand cmd = new SqlCommand("select customer_id,first_name from jobsheetDetails", con)) { string _data = ""; cmd.CommandType = CommandType.Text; SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { _data = JsonConvert.SerializeObject(ds.Tables[0]); } return _data; } } } catch (Exception ex) { // 建议返回错误信息,方便前端排查问题 return JsonConvert.SerializeObject(new { error = ex.Message }); } }
方式二:用JArray接收(无需定义实体类)
如果你不想定义实体类,可以用Newtonsoft.Json的JArray来接收(需要先引用Newtonsoft.Json包):
using Newtonsoft.Json.Linq; [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public static object Details4(JArray selectedJobSheet) { try { // 遍历JArray里的每个对象 foreach (JObject item in selectedJobSheet) { string itemData = item["var_name_data"].ToString(); // 处理你的业务逻辑 } // 数据库查询逻辑不变 string constr = ConfigurationManager.ConnectionStrings["Constr"].ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { using (SqlCommand cmd = new SqlCommand("select customer_id,first_name from jobsheetDetails", con)) { string _data = ""; cmd.CommandType = CommandType.Text; SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { _data = JsonConvert.SerializeObject(ds.Tables[0]); } return _data; } } } catch (Exception ex) { return JsonConvert.SerializeObject(new { error = ex.Message }); } }
额外注意点
- 确保WebMethod的路径正确:比如你的页面是
MyPage.aspx,那url应该是"MyPage.aspx/Details4"。 - 确认已经引用了Newtonsoft.Json包(如果用JArray或者JsonConvert的话),可以通过NuGet安装。
- 前端的
contentType已经设置为application/json; charset=utf-8,这个是正确的,不要修改。
内容的提问来源于stack exchange,提问作者karthik kasula
相关产品推荐
相关产品推荐

