我需要为一个序列的每个元素调用一个函数,目前我已经尝试过Seq.iter和Seq.map但它们分别返回单位和'a - >'c而不是我需要的Json.
我试过了
Seq.iter (fun _ (a,b,c,d) -> iterateThroughMySequnce a b c d ()) sequence
Seq.fold (fun _ (a,b,c,d) -> iterateThroughMySequnce a b c d ()) sequence
Run Code Online (Sandbox Code Playgroud)
但我没有得到Json的预期回报类型.在下面的评论中写着"像这样的东西"的代码需要
谁能帮忙谢谢
open Newtonsoft.Json.Linq
type Json =
| JObj of Json seq
| JProp of string * Json
| JArr of Json seq
| JVal of obj
let (!!) (o: obj) = JVal o
let rec toJson = function
| JVal v -> new JValue(v) :> JToken
| JProp(name, (JProp(_) as v)) -> new JProperty(name, new JObject(toJson v)) :> JToken
| JProp(name, v) -> new JProperty(name, toJson v) :> JToken
| JArr items -> new JArray(items |> Seq.map toJson) :> JToken
| JObj props -> new JObject(props |> Seq.map toJson) :> JToken
let sequence = seq { yield "USD", 12.36M, 156.32M, 18.23M
yield "JPY", 13.36M, 564.32M, 17.23M
yield "GBP", 14.36M, 516.32M, 120.23M }
let iterateThroughMySequnce a b c d () =
JObj [JProp("CurrencyCode", !! a);
JProp("TotalPerCurrencyBeforeExchange", !! b);
JProp("ExchangeRate", !! c);
JProp("TotalPerCurrencyAfterExchange", !! d)];
let k =
JObj [
JProp("InvoiceNumber", !! "13456789");
JProp("InvoiceDate", !! "21/12/2015");
JProp("InvoiceCurrency", !! "USD");
JProp("InvoiceProfitMargin", !! 2.3);
JProp("InvoicePaymentCurrencyToEuroExchangeRate", !! 0.8658745M);
JProp("InvoicePeroid", !! "01/01/2015 00:00:00 - 01/02/2015 23:59:59");
JProp(
"Transaction",
JArr [
//Something like this
Seq.iter (fun (a,b,c,d) -> iterateThroughMySequnce a b c d ()) sequence
])
JProp("TransactionForPeroid", !! 254584.00M);
JProp("InvoicingAmountWithProfitMarginApplied", !! 8452.01M);
JProp("InvoicingAmountWithProfitMarginAppliedInEuro", !! 7851.28);
]
let json = toJson k
Run Code Online (Sandbox Code Playgroud)
您需要Seq.map将输入序列转换为输出序列(并使用指定的函数将每个元素转换为新值).您的代码几乎是正确的,但调用不应该包含在另一个列表中:
JProp(
"Transaction",
JArr (Seq.map (fun (a,b,c,d) -> iterateThroughMySequnce a b c d ()) sequence)
)
Run Code Online (Sandbox Code Playgroud)
如果你改变你的iterateThroughMySequence函数来接受一个元组,你可以使这个更好(并且,它应该以不同的名称命名,因为它不是迭代!)
let formatItemAsJson (a,b,c,d) =
JObj [JProp("CurrencyCode", !! a);
JProp("TotalPerCurrencyBeforeExchange", !! b);
JProp("ExchangeRate", !! c);
JProp("TotalPerCurrencyAfterExchange", !! d)];
// Later in the main part of code
JProp("Transaction", JArr (Seq.map iterateThroughMySequnce sequence))
Run Code Online (Sandbox Code Playgroud)
另外,F#数据库附带了JsonValue类型(参见API参考),它实现了你在这里做的一些事情 - 它允许你构造和格式化JSON(并且还解析它).