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

React前端向C#后端提交登录对象时反序列化失败求助

问题原因及解决方案

问题根源

前端代码里犯了格式错误:你把payload序列化成JSON字符串后,又额外包装成了包含json字段的对象发送给后端。这导致后端接收到的请求体格式是:

{"json": "{\"Email\":\"xxx@xxx.com\",\"Password\":\"xxx\"}"}

但后端的[FromBody] LoginDTO期望直接接收LoginDTO结构的JSON:

{"Email":"xxx@xxx.com","Password":"xxx"}

格式完全不匹配,自然会在解析第一个{时失败。

前端代码修改方案(二选一即可)

方案1:直接传递对象(推荐)

axios会自动帮你序列化对象并设置正确的Content-Type: application/json,不需要手动调用JSON.stringify:

const handleSubmit = async (e) => {
  e.preventDefault();
  
  try {
    const { data } = await axios.post(
      "https://localhost:5001/api/User/Login",
      payload // 直接传对象,不用包成{json},也不用JSON.stringify
    );
    console.log(data);
    ctxDispatch({ type: "USER_LOGIN", payload: data });
    localStorage.setItem("userInfo", JSON.stringify(data));
    toast.success("Login Successful");
    navigate("/");
  } catch (err) {
    toast.error(getError(err));
  }
};

方案2:手动传递JSON字符串(仅特殊需求下使用)

如果一定要手动序列化,需要直接发送字符串本身,不要包装成对象,同时显式设置请求头:

const handleSubmit = async (e) => {
  e.preventDefault();
  const json = JSON.stringify(payload);
    
  try {
    const { data } = await axios.post(
      "https://localhost:5001/api/User/Login",
      json, // 直接传序列化后的字符串
      {
        headers: {
          'Content-Type': 'application/json' // 显式设置内容类型
        }
      }
    );
    console.log(data);
    ctxDispatch({ type: "USER_LOGIN", payload: data });
    localStorage.setItem("userInfo", JSON.stringify(data));
    toast.success("Login Successful");
    navigate("/");
  } catch (err) {
    toast.error(getError(err));
  }
};

后端代码无需修改

你的后端Login接口和LoginDTO类都是正确的,只要前端传递正确格式的JSON,就能正常解析。

内容的提问来源于stack exchange,提问作者kyleruban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:05:21