Azure Functions 3.1 .NET Core HttpResponse 在序列化对象上更改大小写

Posted

技术标签:

【中文标题】Azure Functions 3.1 .NET Core HttpResponse 在序列化对象上更改大小写【英文标题】:Azure Functions 3.1 .NET Core HttpResponse changing case on serialized object 【发布时间】:2022-01-09 02:25:03 【问题描述】:

我有一个带有 HttpTrigger 的 Azure 函数。当返回一个带有 Pascal 大小写的对象时,序列化会将大小写更改为 Camel 大小写。

有没有一种方法可以配置默认序列化而不对每个函数的响应使用自定义序列化?

更重要的是,为什么会发生这种情况,这是一项怎样的功能?更改序列化对象的大小写是一件大事。

这里是 Http 触发函数的代码示例。当我用 Postman 调用方法时,结果是驼峰式,而类是 pascal。

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using MyService.Models;

namespace MyService.BFF

    public static class GetWorkOrders
    
        [FunctionName("GetWorkOrders")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
            ILogger log)
        
            var workOrders = new List<WorkOrder>()
            
                new WorkOrder()
                
                    WorkOrderId = "1",
                    CustomerId = "1",
                ,
                new WorkOrder()
                
                    WorkOrderId = "2",
                    CustomerId = "2",
                
            ;

            return new OkObjectResult(workOrders);
        
    

【问题讨论】:

函数应用的语言是什么?您指的是 JSON 响应的大小写吗?您使用哪个模块/库进行序列化 - newtonsoft / system.text ? 我添加了一个代码示例并进一步说明。我正在使用 C#、.net core v 3.1 看看设置这个属性是否有帮助..***.com/a/58135043/14973743 这将适合您的函数应用程序..,请参阅***.com/a/64894580/14973743 说实话,我只是把我的模型改成了驼色。我也计划使用 CosmosDb,并且在使用 inputBindings 或触发器时,阅读文档也可能会被“骆驼化”。我仍然认为这是一个巨大的错误,通过改变大小写,序列化正在破坏不同服务之间的合同。 【参考方案1】:

您可以尝试以下几种解决方法

    如果您想在自己的代码中使用JsonSerializer,您应该将配置传递给它。 这是一个示例代码 -

    var options = new JsonSerializerOptions()
    
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    ;
    return Json(empList, options);
    

    更多信息可以参考System.Text.Json.JsonPropertyName not working for CosmosDb in .NET Core

    您可以安装Microsoft.AspNetCore.Mvc.NewtonsoftJson --version 3.1.1 包并在启动类中包含以下命名空间-ConfigureServices 方法。在下面的代码中,它将不再转换为驼峰式,

    using Microsoft.Extensions.DependencyInjection;
    using Newtonsoft.Json.Serialization;
    
    public void ConfigureServices(IServiceCollection services)
    
        services.AddControllers().AddNewtonsoftJson(options =>
        
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        );
    
    

同时考虑

我也打算使用 CosmosDb,使用 inputBindings 或触发器时,读取文档也可能会“驼峰化”。

CosmosDb 使用 camelCase 而不是 PascalCase,因此这些属性不会映射到任何东西。要解决此问题,请将 JsonPropertyName 属性添加到您的 CosmosDb 容器中,以将数据传输到您的 C# 模型。

更多信息可以参考System.Text.Json.JsonPropertyName not working for CosmosDb in .NET Core

参考: C# Set Casing Convention Globally for Azure Function v3

【讨论】:

以上是关于Azure Functions 3.1 .NET Core HttpResponse 在序列化对象上更改大小写的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 .NET Core 3.1 通过 Visual Studio 2019 开发 Azure Functions 时使用 AD 身份验证

正式发布!Azure Functions OpenAPI Extension

更新到 Microsoft.Net.Functions 3.0.3 后如何正确设置 Azure 队列触发器?

.NET 5 支持 Azure Functions OpenAPI 扩展啦

Azure Functions .net 6 中的策略授权

.net 核心 3.0 上的 Azure Functions