React Native中Axios发送整个对象而非值的问题排查
Axios发送日期字符串被包装成对象的原因解析
问题核心
你的后端接口GetAssignmentsByDate通过[FromBody] DateTime date接收原始JSON字符串类型的日期值,但Axios发送的却是{"date": "xxx"}格式的JSON对象,导致.NET无法将对象反序列化为DateTime类型,抛出错误"The JSON value could not be converted to System.DateTime."。而直接传入字符串字面量时请求正常,核心原因在于你传入Axios的date参数类型和字面量不一致。
背后的运行机制
1. 后端模型绑定规则
.NET的[FromBody]绑定对于单个值类型(比如DateTime),期望请求体是原始JSON值(例如"2024-01-07T02:23:08.805Z"),而非JSON对象。如果请求体是对象,模型绑定器无法将对象映射到单个DateTime参数,就会触发解析错误。
2. Axios的序列化逻辑
Axios默认使用JSON.stringify()处理请求体,行为规则很明确:
- 当传入字符串字面量(比如
data: '2024-01-07T02:23:08.805Z'),JSON.stringify()直接输出该字符串的JSON表示:"2024-01-07T02:23:08.805Z",完全符合后端要求。 - 当传入对象(比如
data: {date: "2024-01-07T02:23:08.805Z"}),JSON.stringify()输出对应的JSON对象:{"date":"2024-01-07T02:23:08.805Z"},和后端预期不匹配。
3. 为什么变量date会变成对象?
你提到date = new Date().toISOstring()生成的是字符串,但请求日志显示为对象,大概率是以下两种情况:
- 赋值错误:实际代码中可能误将
date赋值为了对象,比如写成date = { date: new Date().toISOString() },而非纯字符串。这种情况下date是对象,Axios自然会序列化为JSON对象。 - 封装函数的隐式处理:你的
ApiManager自定义函数可能存在自动包装逻辑——比如为了统一请求格式,将非对象类型的data自动包装成以变量名为键的对象。这种自定义逻辑会把字符串变量date包装成{date: 字符串值}。
验证与解决
- 验证变量类型:在发送请求前添加
console.log(typeof date, date),如果输出是object而非string,说明变量类型错误。 - 修正赋值:确保
date是纯字符串(注意是大写S的toISOString,小写s会报错导致变量为undefined):const date = new Date().toISOString(); - 调整封装函数:如果
ApiManager有自动包装逻辑,修改它支持直接传递原始值,或者显式传递字符串。
内容的提问来源于stack exchange,提问作者CodeMan03
相关产品推荐
相关产品推荐

