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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:23:16