.NET8 Azure Function无法转换Service Bus中的JSON消息
问题分析与解决方案
错误核心原因是:.NET 8 中 System.Text.Json 默认启用了严格的数字处理规则,不再允许将 JSON 中的数字类型隐式转换为字符串类型;而 .NET 6 中默认允许这种转换,所以相同代码在 .NET 6 环境下正常运行。
你的 JSON 消息里language字段是数字1,但模型中对应的Language属性是string类型,.NET 8 的默认序列化规则拒绝了这种类型转换,抛出了JsonException。
解决方案有三种,按需选择:
1. 修改模型属性类型匹配 JSON 字段类型
直接将Language属性的类型从string改为int(或long,根据业务场景),让类型完全匹配:
public class AudioServiceBusRequest { [JsonPropertyName("wordId")] public long? WordId { get; set; } [JsonPropertyName("language")] public int Language { get; set; } // 改为int类型 [JsonPropertyName("word")] public string Word { get; set; } }
2. 配置 JsonSerializerOptions 允许数字转字符串
在反序列化时传入自定义配置,显式允许将数字读取为字符串:
public async Task Run( [ServiceBusTrigger("wordvoice", Connection = "SBConnectionString")] string message) { var serializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString }; AudioServiceBusRequest request = JsonSerializer.Deserialize<AudioServiceBusRequest>(message, serializerOptions); await ProcessService.ProcessAudio(request, processName, _logger); }
JsonNumberHandling.AllowReadingFromString会让序列化器将 JSON 中的数字类型解析为字符串属性的值。
3. 全局配置序列化规则(适用于多个地方需要转换的场景)
如果你的项目中有多处需要这种转换,可以在 Function 的启动配置中全局设置JsonSerializerOptions:
// Program.cs var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(builder => { builder.Services.Configure<JsonSerializerOptions>(options => { options.NumberHandling = JsonNumberHandling.AllowReadingFromString; }); }) .Build(); host.Run();
注意:全局配置会影响所有使用默认JsonSerializer的地方,需确认业务场景是否都允许这种转换。
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

