Return Azure Functions 中 JSON 的 F# 记录类型

Return an F# record type as JSON in Azure Functions

我正在 F# 中创建一个简单的 azure 函数。最后,我返回的记录类型为 JSON。我正在做这样的事情:

let y = {Gender = "Woman"; Frequency = 17; Percentage = 100.0}
req.CreateResponse(HttpStatusCode.OK, y);

当我从 Postman 调用该函数时,我得到了这个 JSON {"Gender@":"Woman","Frequency@":17,"Percentage@":100}

看起来这是由默认序列化程序 (Serializing F# Record type to JSON includes '@' character after each property) 引起的。

然后我尝试使用Newtonsoft.Json。现在,代码如下所示:

req.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(y));

但现在我正在使用邮递员获取此信息:

"{\"Gender\":\"Woman\",\"Frequency\":17,\"Percentage\":100}"

我希望收到这样的回复: {"Gender":"Woman","Frequency":17,"Percentage":100}

如何获得此 JSON 响应?除了指定 DataMemberAttribute 之外还有其他方法吗?

谢谢

我不是 100% 了解您为什么会收到该响应,我认为这是因为您实际上是在获取对象的字符串而不是实际的字符串。如果你这样做它会起作用(我认为):

let response = sprintf "%s" JsonConvert.SerializeObject(y)
req.CreateResponse(HttpStatusCode.OK, response)

我认为您不能使用 JSON.Net(会更好),因为 AzureFunctions 基础结构似乎是数据契约序列化程序

我刚刚按照 Serializing F# Record type to JSON includes '@' character after each property 实施了修复,如果比您希望的笨拙一点,它对我有用。

我也在努力解决这个问题,你让我朝着正确的方向前进 - 谢谢

#r "System.Runtime.Serialization"

open System.Runtime.Serialization

[<DataContract>]
type SearchItem = {
    [<field: DataMember(Name="Gender")>]
    Gender: string
    [<field: DataMember(Name="Frequency")>]
    Frequency: int
    [<field: DataMember(Name="Percentage")>]
    Percentage: float
} 

我找到了一个超级简单的方法来解决这个问题!

req.CreateResponse() 有一个重载,它将 JsonMediaTypeFormatter 作为第三个参数。这允许我们将 ContractResolver 设置为 Json.Net.

提供的值
let jsonFormatter = System.Net.Http.Formatting.JsonMediaTypeFormatter()
jsonFormatter.SerializerSettings.ContractResolver <- Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()

return req.CreateResponse(HttpStatusCode.OK, { Foo = "Bar" }, jsonFormatter)