簡體   English   中英

在Azure Functions中將F#記錄類型作為JSON返回

[英]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}

看起來這是由默認的序列化程序引起的(將F#Record類型序列化為JSON,在每個屬性后包含'@'字符 )。

然后我嘗試使用Newtonsoft.Json。 現在,代碼如下所示:

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

但現在我使用郵遞員得到這個:

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

我想得到這樣的答復: {"Gender":"Woman","Frequency":17,"Percentage":100}

我怎樣才能得到這個JSON響應? 除了指定DataMemberAttribute之外還有其他方法嗎?

謝謝

我發現了一種解決這個問題的超級簡單方法!

req.CreateResponse()有一個重載, 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)

我不認為你可以使用JSON.Net(會很好)因為AzureFunctions基礎設施似乎是數據合同序列化器

我剛剛按照序列化F#記錄類型實現了修復,JSON在每個屬性后都包含'@'字符,如果有點笨笨,它對我有用。

我也在努力解決這個問題,你讓我朝着正確的方向前進 - 謝謝

#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
} 

我不是100%為什么你得到那個響應,我認為這是因為你實際上是在取一個對象的字符串而不是實際的字符串。 如果你這樣做它會工作(我認為):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM