在.NET 6隔离的Azure Function中指定JsonSerializerOptions。

8

我正在尝试在刚刚从.NET 6(隔离托管模型)迁移的Azure Function中从代码调用Web API。 在迁移期间,我抓住机会摆脱了RestSharp和Json.NET依赖库,现在仅使用HttpClientSystem.Text.Json来处理HTTP调用和JSON数据。

我尝试使用以下代码,似乎是完美的组合:

Project project = await _httpClient.GetFromJsonAsync<Project>(someUrl);

if (project != null)
{
    HttpResponseData callResponse = req.CreateResponse(HttpStatusCode.OK);
    
    await callResponse.WriteAsJsonAsync(project);
    
    return callResponse;
}

调用很顺利——我毫无问题地收到了我的Project对象。
但不幸的是,用这段代码似乎不能影响响应中JSON的呈现方式——例如,在我的情况下,会返回null值(我想避免这种情况),并且所有属性名称都是大写的(“Institute”而不是“institute”,“LeadLanguage”而不是“leadLanguage”)。
没问题——只需使用一个JsonSerializerOptions对象并定义您想要的内容。我可以创建这样的对象——但是我在哪里插入它呢? WriteAsJsonAsync似乎不支持将序列化程序选项作为参数(为什么??),我找不到一种方法在全局范围内定义我的JsonSerializerOptions(因为我找到的所有内容似乎都基于services.AddControllers().AddJsonOptions()方法——但由于我的Azure函数在其启动代码中没有AddControllers部分,所以我无法使用它)。
我已经成功通过以下方式获取所需的结果:
if (project != null)
{
    HttpResponseData callResponse = req.CreateResponse(HttpStatusCode.OK);
    
    callResponse.Headers.Add("Content-Type", "application/json");
    string jsonResponse = JsonSerializer.Serialize(project, settings);
    await callResponse.WriteStringAsync(jsonResponse, Encoding.UTF8);

    return callResponse;
}

但这个方法看起来有点复杂和“低级”-需要手动将结果对象转换成字符串,手动设置Content-Type等...

在 Azure Function (.NET 6 isolated hosting model) 中真的没有一种全局指定JsonSerializerOptions的方法吗?或者调用 WriteAsJsonAsync 并传入一个特定的序列化选项对象?

2个回答

24

我发布问题后10秒钟,当然!我找到了使用Azure函数完成它的方法。

类似于这样:


var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(s =>
    {
        s.AddHttpClient();
        // define your global custom JSON serializer options
        s.Configure<JsonSerializerOptions>(options =>
        {
            options.AllowTrailingCommas = true;
            options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
            options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
            options.PropertyNameCaseInsensitive = true;
        });

希望这能对其他人有所帮助!


3
也可以在ConfigureFunctionsWorkerDefaults中完成。
  var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults(builder =>
{
    builder.Serializer = new JsonObjectSerializer(new JsonSerializerOptions
    {
        AllowTrailingCommas = true,
        .....
    });
}) .ConfigureServices((context, services) =>{.....}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接