You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:13:14