我不明白为什么
let data =
JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(
File.ReadAllText <| Path.Combine(myPath, "ejv.json"))
还可以,而这
let data =
JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>
<| File.ReadAllText
<| Path.Combine(myPath, "ejv.json")
给我两个错误,首先是:
第二个是:
我做错什么了?
UPDATE @PatrykĆwiek建议进行良好的编辑,似乎可以修复类型错误:
let data = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>
<< File.ReadAllText
<| Path.Combine(myPath, "ejv.json")
但是,这又产生了另一条令人费解的消息:意外的类型参数。这是屏幕截图:
我可以轻松地删除它,<Dictionary<string, Dictionary<string, string>>>
但是在这种情况下,我的数据是object
类型,而不是Dictionary
。我还能以某种方式保存使用流水线的类型信息吗?
解
感谢@ Patryk,Ćwiek的解决方案如下:
let d<'a>(s:string) = JsonConvert.DeserializeObject<'a>(s)
let data =
Path.Combine(myPath, "ejv.json")
|> File.ReadAllText
|> d<Dictionary<string, Dictionary<string, string>>> with
我不知道为什么,但是没有这个别名d
是行不通的。
据我所知,评估从左到右进行,因此您的第二个表达式等效于:
let data =
(JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>> <| File.ReadAllText)
<| Path.Combine(myPath, "ejv.json")
注意操作流程。这意味着您DeserializeObject
要先传递一个函数,可能不是您要执行的操作。
执行此操作时:
let data =
JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>
<| (File.ReadAllText <| Path.Combine(myPath, "ejv.json"))
它会工作。这相当于您的第一个选择。
另一种解决方案是反转管道以使数据流更自然:
let data = Path.Combine(myPath, "ejv.json")
|> File.ReadAllText
|> JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>
我忽略了一种不常用的选项。您也可以使用函数组合运算符<<
使其工作:
let data = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>
<< File.ReadAllText
<| Path.Combine(myPath, "ejv.json")
它本质上是合并DeserializeObject : string -> 'a
并ReadAllText : string -> string
合并到(在上面的示例中未命名)函数f : string -> 'a
,其中f(s) = DeserializeObject(ReadAllText(s))
。然后将Path.Combine
通过管道的结果输入f
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句