我正在尝试在刚刚从.NET 6(隔离托管模型)迁移的Azure Function中从代码调用Web API。 在迁移期间,我抓住机会摆脱了RestSharp和Json.NET依赖库,现在仅使用HttpClient
和System.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
并传入一个特定的序列化选项对象?