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

Azure Function返回带JsonPropertyName注解对象时注解不生效的解决方法

让Azure Function直接返回对象时生效System.Text.Json的JsonPropertyName注解

问题场景

我们定义了带有JsonPropertyName注解的Foo类,用于指定JSON序列化的键名:

public class Foo {
    [JsonPropertyName("x")]
    public string Prop1 { get; set; }

    [JsonPropertyName("y")]
    public string Prop2 { get; set; }

    [JsonPropertyName("z")]
    public string Prop3 { get; set; }
}

在Azure Function中直接返回该类实例:

[FunctionName("Func")]
public static Foo Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    ILogger log
)
{
    Foo foo = new();
    foo.Prop1 = "Value 1";
    foo.Prop2 = "Value 2";
    foo.Prop3 = "Value 3";

    return foo;
}

实际返回的JSON使用了类的属性名,而非注解指定的键名:

{
    "Prop1" : "Value 1",
    "Prop2" : "Value 2",
    "Prop3" : "Value 3"
}

预期的正确返回应该是:

{
    "x" : "Value 1",
    "y" : "Value 2",
    "z" : "Value 3"
}

手动序列化字符串可以解决问题,但希望直接返回对象时让JsonPropertyName注解生效(使用Newtonsoft的注解时可正常工作,但项目未使用Newtonsoft)。

解决方法

方法1:全局配置使用System.Text.Json序列化

Azure Functions默认可能仍使用Newtonsoft.Json处理返回对象的序列化,需配置切换为System.Text.Json:

  • 本地开发:在local.settings.json中添加配置项:
{
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "JsonSerializerSettings__ContractResolver": "System.Text.Json.Serialization.DefaultJsonTypeInfoResolver"
  }
}
  • 隔离进程模型:在Program.cs中直接配置序列化选项:
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(builder =>
    {
        builder.ConfigureJsonOptions(options =>
        {
            // 保留JsonPropertyName的自定义命名,不使用默认命名策略
            options.SerializerOptions.PropertyNamingPolicy = null;
        });
    })
    .Build();

host.Run();

方法2:用IActionResult包装返回对象

无需全局配置,在函数中返回OkObjectResult并指定System.Text.Json的序列化逻辑:

[FunctionName("Func")]
public static IActionResult Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    ILogger log
)
{
    Foo foo = new();
    foo.Prop1 = "Value 1";
    foo.Prop2 = "Value 2";
    foo.Prop3 = "Value 3";

    var jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = null };
    return new OkObjectResult(foo)
    {
        SerializerSettings = new SystemTextJsonSerializerOptions(jsonOptions)
    };
}

注意:需要确保项目引用了Microsoft.AspNetCore.Mvc.Core或对应版本的Azure Functions SDK包。

方法3:自定义输出绑定(进阶)

若需要全局统一处理序列化逻辑,可创建自定义输出绑定,指定使用System.Text.Json进行序列化。此方式适合复杂场景,但配置步骤较多,需实现绑定扩展。

内容的提问来源于stack exchange,提问作者mburm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:30:03