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

React使用useForm提交嵌套对象时子字段被转义为字符串如何解决

问题根源

你提前对category字段执行了JSON.stringify,相当于提前把嵌套对象转成了字符串类型。当你提交完整请求体再做整体JSON序列化的时候,字符串类型的category会被自动加上双引号、内部的双引号会被加转义反斜杠,最终就变成了你看到的错误结构。


解决方案

1. 直接在useForm中嵌套对象(最推荐)

useForm本身支持嵌套字段的定义,不需要提前序列化category:

  • 注册字段的时候直接用嵌套写法,比如register("category.id")、register("category.name")、register("category.description")
  • 提交时handleSubmit拿到的values里的category本身就是标准对象,不需要额外处理,直接整体序列化提交即可
    示例代码:
const { register, handleSubmit } = useForm();

const onSubmit = (values) => {
  // 这里values.category已经是对象,直接用就行
  fetch("/your/api", {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify(values)
  })
}

// 表单里的输入示例
<input {...register("name")} placeholder="菜品名称" />
<input {...register("category.id")} placeholder="分类ID" />
<input {...register("category.name")} placeholder="分类名称" />

2. 提交前反序列化category(适合已提前序列化的场景)

如果你因为业务逻辑必须提前把category转成字符串存入useForm,那就在提交前手动把category字段转回对象:

const onSubmit = (values) => {
  // 把字符串类型的category转回对象
  const formattedValues = {
    ...values,
    category: JSON.parse(values.category)
  }
  // 再序列化formattedValues提交即可
  fetch("/your/api", {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify(formattedValues)
  })
}

3. 检查提交时的Content-Type头

务必确保请求头的Content-Type设置为application/json,否则服务端可能不会正确解析JSON结构的请求体。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:04