InvalidOperationException:无法获取令牌类型“Number”的值作为字符串

Ili*_*ias 11 c# model-view-controller asp.net-web-api asp.net-core-6.0

完整错误:\nInvalidOperationException:无法获取字符串形式的标记类型“Number”的值。\nSystem.Text.Json.Utf8JsonReader.GetString()

\n

JsonException:无法将 JSON 值转换为 System.String。路径:$[0].status | 行号: 0 | BytePositionInLine:197。\nSystem.Text.Json.ThrowHelper.ReThrowWithPath(参考ReadStack状态,参考Utf8JsonReader阅读器,异常前)

\n

我有一个 MVC 项目正在尝试使用正常工作的 Web API。现在,有HouseController.cs

\n
using\xc2\xa0Microsoft.AspNetCore.Mvc;\nusing\xc2\xa0Task3.Controllers.Services;\n \nnamespace\xc2\xa0Task3.Controllers;\n \npublic\xc2\xa0class\xc2\xa0HouseController\xc2\xa0:\xc2\xa0Controller\n{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0private\xc2\xa0readonly\xc2\xa0IHouseService\xc2\xa0_service;\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0HouseController(IHouseService\xc2\xa0service)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0_service\xc2\xa0=\xc2\xa0service\xc2\xa0??\xc2\xa0throw\xc2\xa0new\xc2\xa0ArgumentNullException(nameof(service));\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0async\xc2\xa0Task<IActionResult>\xc2\xa0Index()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0var\xc2\xa0houses\xc2\xa0=\xc2\xa0await\xc2\xa0_service.Find();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\xc2\xa0View(houses);\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

也就是调用Find()接口中的方法IHouseService

\n
using\xc2\xa0Task3.Models;\n \nnamespace\xc2\xa0Task3.Controllers.Services\n{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0interface\xc2\xa0IHouseService\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Task<IEnumerable<HouseModel>>\xc2\xa0Find();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

依次调用相同的方法HouseService.cs

\n
using\xc2\xa0Task3.Controllers.Helper;\nusing\xc2\xa0Task3.Models;\n \nnamespace\xc2\xa0Task3.Controllers.Services\n{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0class\xc2\xa0HouseService\xc2\xa0:\xc2\xa0IHouseService\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0private\xc2\xa0readonly\xc2\xa0HttpClient\xc2\xa0_client;\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0const\xc2\xa0string\xc2\xa0BasePath\xc2\xa0=\xc2\xa0"/api/Houses";\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0HouseService(HttpClient\xc2\xa0client)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0_client\xc2\xa0=\xc2\xa0client\xc2\xa0??\xc2\xa0throw\xc2\xa0new\xc2\xa0ArgumentNullException(nameof(client));\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0async\xc2\xa0Task<IEnumerable<HouseModel>>\xc2\xa0Find()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0var\xc2\xa0response\xc2\xa0=\xc2\xa0await\xc2\xa0_client.GetAsync(BasePath);\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\xc2\xa0await\xc2\xa0response.ReadContentAsync<List<HouseModel>>();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

哪个调用ReadContentAsync<List<HouseModel>>()

\n
using\xc2\xa0Newtonsoft.Json;\nusing\xc2\xa0JsonSerializer\xc2\xa0=\xc2\xa0System.Text.Json.JsonSerializer;\n \nnamespace\xc2\xa0Task3.Controllers.Helper\n{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0static\xc2\xa0class\xc2\xa0HttpClientExtensions\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0static\xc2\xa0async\xc2\xa0Task<T>\xc2\xa0ReadContentAsync<T>(this\xc2\xa0HttpResponseMessage\xc2\xa0response)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if\xc2\xa0(response.IsSuccessStatusCode\xc2\xa0==\xc2\xa0false)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0throw\xc2\xa0new\xc2\xa0ApplicationException($"Something\xc2\xa0went\xc2\xa0wrong\xc2\xa0calling\xc2\xa0the\xc2\xa0API:\xc2\xa0{response.ReasonPhrase}");\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0var\xc2\xa0dataAsString\xc2\xa0=\xc2\xa0await\xc2\xa0response.Content.ReadAsStringAsync().ConfigureAwait(false);\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Console.WriteLine(dataAsString);\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0var\xc2\xa0result\xc2\xa0=\xc2\xa0JsonSerializer.Deserialize<T>(dataAsString);\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\xc2\xa0result;\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

并且该行Deserialize<T>返回前面提到的错误。

\n

我尝试的显然是调试,该Deserialize<T>方法除了返回错误之外,还返回 null '因为它显然无法将 Json 结果转换为 Model 属性。这是HouseModel

\n
namespace\xc2\xa0Task3.Models;\n \npublic\xc2\xa0class\xc2\xa0HouseModel\n{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0Price\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0Region\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0PublicationDate\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0GeoLat\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0GeoLon\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0BuildingType\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0Area\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0Rooms\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0FloorNum\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0TotalFloor\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0ObjectType\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0Id\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0status\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0string\xc2\xa0Photo\xc2\xa0{\xc2\xa0get;\xc2\xa0set;\xc2\xa0}\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

顺便说一句,之前HouseModel属性是 int、DateTime 等,错误是无法转换为 Int32。

\n

我还使用了自定义转换器StringConverter

\n
public\xc2\xa0class\xc2\xa0StringConverter\xc2\xa0:\xc2\xa0System.Text.Json.Serialization.JsonConverter<string>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0override\xc2\xa0string\xc2\xa0Read(ref\xc2\xa0Utf8JsonReader\xc2\xa0reader,\xc2\xa0Type\xc2\xa0typeToConvert,\xc2\xa0JsonSerializerOptions\xc2\xa0options)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if\xc2\xa0(reader.TokenType\xc2\xa0==\xc2\xa0JsonTokenType.Number)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0var\xc2\xa0stringValue\xc2\xa0=\xc2\xa0reader.GetInt32();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0stringValue\xc2\xa0=\xc2\xa0stringValue;\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\xc2\xa0stringValue.ToString();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0else\xc2\xa0if\xc2\xa0(reader.TokenType\xc2\xa0==\xc2\xa0JsonTokenType.String)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\xc2\xa0reader.GetString();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0throw\xc2\xa0new\xc2\xa0System.Text.Json.JsonException();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0public\xc2\xa0override\xc2\xa0void\xc2\xa0Write(Utf8JsonWriter\xc2\xa0writer,\xc2\xa0string\xc2\xa0value,\xc2\xa0JsonSerializerOptions\xc2\xa0options)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0writer.WriteStringValue(value);\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n \n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n
Run Code Online (Sandbox Code Playgroud)\n

但在这种情况下,每个条目都是null.

\n

有人可以分享一些见解吗?

\n

Ili*_*ias 3

我自己解决了这个问题。问题是我使用了两种不同的模型。MVC 中的一个和 API 中的一个,它们具有不同的数据类型和变量名称,这是主要问题。