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
相关产品推荐
相关产品推荐

