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

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);

额外优化建议

  1. 将请求的Content-Type改为标准的application/json(你发送的是完整JSON对象,而非JSON Patch):
request.Content = new StringContent(JsonSerializer.Serialize(tskObj), Encoding.UTF8, "application/json");
  1. 添加响应状态码检查,确保请求成功后再处理响应:
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode(); // 非2xx状态码会抛出HttpRequestException

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:45:39