如何让HttpClient.GetFromJsonAsync()的第二个调用正常工作?
问题解决:Blazor调用返回字符串的API接口失败
问题场景
Blazor页面中有两个API调用,第一个正常工作,第二个抛出JSON解析异常:
private async void SelectQuiz() { List<String>? ls = await httpClient.GetFromJsonAsync<List<String>>("api/BgQuizAnswer/GetBgQuizList"); String? txt = await httpClient.GetFromJsonAsync<String> ("api/BgQuizAnswer/GetHello"); }
后端对应接口代码:
[HttpGet] [Route("GetBgQuizList")] public ActionResult<List<String>> GetBgQuizList() { return _bgQuizAnswerService.GetBgQuizList(); } [HttpGet] [Route("GetHello")] public ActionResult<String> GetHello() { return "Hello"; }
报错信息:
未处理的异常:
System.Text.Json.JsonException: 'H' 是无效的值起始字符。路径: $ | LineNumber: 0 | BytePositionInLine: 0。
---> System.Text.Json.JsonReaderException: 'H' 是无效的值起始字符。LineNumber: 0 | BytePositionInLine: 0。
错误原因
GetFromJsonAsync方法要求后端返回标准JSON格式的数据。你的GetHello接口直接返回纯文本Hello,而合法的JSON字符串必须被双引号包裹(例如"Hello")。解析器读取到无引号的H时,会判定为无效的JSON起始字符,从而抛出异常。
解决方案
提供两种可行方案,任选其一即可:
方案1:前端改用纯文本接收
既然后端返回的是纯文本,直接使用GetStringAsync替代GetFromJsonAsync:
String? txt = await httpClient.GetStringAsync("api/BgQuizAnswer/GetHello");
方案2:修改后端返回标准JSON格式
让ASP.NET Core返回合法的JSON字符串,有两种实现方式:
- 方式A:显式返回序列化后的JSON字符串
[HttpGet] [Route("GetHello")] public ActionResult<String> GetHello() { return Json("Hello"); }
- 方式B:返回包含字符串的对象(更符合REST API规范)
[HttpGet] [Route("GetHello")] public ActionResult<object> GetHello() { return new { Message = "Hello" }; }
此时前端需要对应修改接收逻辑:
var result = await httpClient.GetFromJsonAsync<dynamic>("api/BgQuizAnswer/GetHello"); String? txt = result.Message;
内容的提问来源于stack exchange,提问作者Hal Heinrich
相关产品推荐
相关产品推荐

