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

ASP.NET Core Blazor创建新记录时反序列化响应为String报错求助

解决ASP.NET Core Blazor中JSON反序列化错误问题

错误场景

开发ASP.NET Core Blazor项目时,创建新服务器记录过程中遇到JSON反序列化错误,错误信息如下:

Error: System.Text.Json.JsonException: The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1.
 ---> System.InvalidOperationException: Cannot get the value of a token type 'StartObject' as a string.
   at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_ExpectedString(JsonTokenType tokenType)
   at System.Text.Json.Utf8JsonReader.GetString()

错误出现在以下语句:

JsonSerializer.DeserializeAsync<string>(responsestream)

相关代码

Blazor组件中的CreateClick方法

private async Task CreateClick()
{
    var deptobj = new ServerNamesClass() { server_Name = server_Name, server_Type = server_Type, operating_System = operating_System, version = version, isActive = isActive };
    var request = new HttpRequestMessage(HttpMethod.Post, config["API_URL"] + "ServerNames");
    request.Content = new StringContent(JsonSerializer.Serialize(deptobj), null, "application/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();
}

数据模型类

public class ServerNamesClass
{
    public int serverID { get; set; }
    public string server_Name { get; set; }
    public string server_Type { get; set; }
    public string operating_System { get; set; }
    public string version { get; set; }
    public bool isActive { get; set; }
}

API控制器代码

[HttpPost]
public ActionResult AddServer(ServerNames ServersName)
{
    return Ok(_IserverNamesService.Insert(ServersName));
}

问题原因

API控制器通过Ok(_IserverNamesService.Insert(ServersName))返回的是序列化后的实体对象(JSON格式的ServerNames对象),但客户端代码试图将这个JSON对象反序列化为string类型,类型不匹配导致反序列化失败。

解决方案

方案一:客户端反序列化为对应实体类(推荐)

将反序列化的目标类型改为与API返回实体匹配的ServerNamesClass,然后提取需要的信息展示:

private async Task CreateClick()
{
    var deptobj = new ServerNamesClass() { server_Name = server_Name, server_Type = server_Type, operating_System = operating_System, version = version, isActive = isActive };
    var request = new HttpRequestMessage(HttpMethod.Post, config["API_URL"] + "ServerNames");
    request.Content = new StringContent(JsonSerializer.Serialize(deptobj), null, "application/json");
    var client = ClientFactory.CreateClient();
    var response = await client.SendAsync(request);
    using var responsestream = await response.Content.ReadAsStreamAsync();
    // 修改反序列化目标类型为ServerNamesClass
    var res = await JsonSerializer.DeserializeAsync<ServerNamesClass>(responsestream);
    // 展示创建成功的信息,比如服务器ID
    await JS.InvokeVoidAsync("alert", $"服务器创建成功,ID:{res.serverID}");
    await RefreshList();
}

方案二:修改API返回字符串

如果业务上确实需要API返回字符串,调整控制器代码,直接返回文本信息:

[HttpPost]
public ActionResult AddServer(ServerNames ServersName)
{
    var insertedServer = _IserverNamesService.Insert(ServersName);
    // 返回字符串形式的成功提示
    return Ok($"服务器创建成功,ID:{insertedServer.serverID}");
}

此时客户端原有的JsonSerializer.DeserializeAsync<string>代码即可正常工作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:22