我无法理解为什么会这样 let data = JsonConvert.DeserializeObjectDictionarystring, Dictionarystring, string( File.ReadAllText | Path.Combine(myPath, "ejv.json")) 没关系,而这个 let data = JsonConvert.DeserializeObjectDictionar
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>>>但在这种情况下,我的数据是对象类型,而不是字典.我可以以某种方式保存类型信息使用流水线吗?
解
感谢@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
我不知道为什么,但如果没有别名,它就行不通.
据我所知,评估从左到右,所以你的第二个表达式相当于: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 into(上例中未命名)函数f:string – > ‘a,其中f(s)= DeserializeObject(ReadAllText(s)).然后它通过管道将Path.Combine的结果输入f.