Blazor调用API新增数据遇Json反序列化错误,数据却已入库
Blazor Server调用POST API添加数据成功但响应解析报错的解决方法
问题描述
我搭建了连接Microsoft SQL Server的REST API,GET、POST、PUT、DELETE功能均正常。用Blazor Server开发UI与API交互,能正常检索数据库数据,但添加新任务时触发以下错误:
Error: System.Text.Json.JsonException: 'N' is an invalid start of a value. Path: $ | LineNumber: 0 |
报错后刷新页面,数据已成功写入数据库,仅前端处理响应时出现异常。
相关createClick代码:
@code{ public class TasksClass { public int TaskID { get; set; } public string TaskTitle { get; set; } public string TaskDetails { get; set; } public string DateAdded { get; set; } } private IEnumerable<TasksClass> tasks = Array.Empty<TasksClass>(); private string modalTitle; private int TaskID; private string TaskTitle; private string TaskDetails; private DateTime DateAdded; // Create click private async Task createClick() { try { var tskObj = new TasksClass() { TaskTitle = TaskTitle, TaskDetails = TaskDetails, DateAdded = DateAdded.ToString("yyyy-MM-dd") }; var request = new HttpRequestMessage(HttpMethod.Post, config["API_URL"] + "Tasks/AddTasks"); request.Content = new StringContent(JsonSerializer.Serialize(tskObj), null, "application/json-patch+json"); var client = ClientFactory.CreateClient(); var response = await client.SendAsync(request); using var responseStream = await response.Content.ReadAsStreamAsync(); string res = await JsonSerializer.DeserializeAsync<string>(responseStream); await JS.InvokeVoidAsync("alert", res); await refreshList(); } catch(HttpRequestException) { throw new BadHttpRequestException("no"); } } }
断点调试确认错误出在这段代码:
string res = await JsonSerializer.DeserializeAsync<string>(responseStream); await JS.InvokeVoidAsync("alert", res);
问题原因
错误核心是API返回的响应内容不符合标准JSON格式。JsonSerializer.DeserializeAsync<string>要求输入的JSON必须是带双引号包裹的字符串(例如"添加成功"),但你的API返回的是无引号的纯文本(例如添加成功或No),这种纯文本不符合JSON语法规则,导致解析器识别到非JSON起始字符(如'N')时报错。
数据能成功入库说明POST请求本身有效,仅前端响应处理逻辑出错。
解决方案
方案1:直接读取纯文本响应(适配API返回纯文本的场景)
替换反序列化代码,直接读取响应的纯文本内容:
// 替换原反序列化代码 string res = await response.Content.ReadAsStringAsync(); await JS.InvokeVoidAsync("alert", res);
方案2:修改API返回标准JSON格式
如果要保留JSON反序列化逻辑,需让API返回符合JSON规范的内容:
- 可以返回带双引号的字符串:
"任务添加成功" - 或返回包含消息字段的JSON对象:
{"Message":"任务添加成功"}
若API返回对象,前端需对应调整反序列化逻辑:
// 先定义响应类 public class ApiResponse { public string Message { get; set; } } // 替换反序列化代码 var res = await JsonSerializer.DeserializeAsync<ApiResponse>(responseStream); await JS.InvokeVoidAsync("alert", res.Message);
额外优化建议
- 将请求的Content-Type改为标准的
application/json(你发送的是完整JSON对象,而非JSON Patch):
request.Content = new StringContent(JsonSerializer.Serialize(tskObj), Encoding.UTF8, "application/json");
- 添加响应状态码检查,确保请求成功后再处理响应:
var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); // 非2xx状态码会抛出HttpRequestException
内容的提问来源于stack exchange,提问作者yakubu azure
相关产品推荐
相关产品推荐

