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
相关产品推荐
相关产品推荐

