F#而不是多个let,我可以管道中间结果

时间:2017-03-31 15:59:58

标签: json dictionary f#

假设:

let json = """
{
    "KeyValuePairs": "[{\"Key\" : \"one\", \"Value\" : \"1\"},{\"Key\" : \"two\", \"Value\" : \"2\"}]"
}
"""
let dict = JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>(json) 
let kvpairs = dict.["KeyValuePairs"]
let kvlist = JsonConvert.DeserializeObject<KeyValuePair<System.String, System.String> List>(kvpairs)
let kvmap = [for kv  in kvlist -> (kv.Key, kv.Value)] |> Map.ofList

我可以使用一个带管道的表达式而不是中间变量吗?如果是这样,那会是什么样的?

FWIW我试过了:

let kvpairs = JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>(json) 
    |> (fun d -> d.["KeyValuePairs"])

但这给了我错误:

error FS0010: Unexpected infix operator in binding. Expected incomplete structured construct at or before this point or other
     

令牌。

更新:另一种方式:流入JsonConvert?

let kvpairs = 
    json
    |> JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>
    |> (fun d -> d.["KeyValuePairs"])

这给了我:

  

错误FS0717:意外的类型参数

1 个答案:

答案 0 :(得分:1)

在您的代码中

let kvpairs = JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>(json) 
    |> (fun d -> d.["KeyValuePairs"])

管道没有缩进得足够远。

let kvpairs = JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>(json) 
              |> (fun d -> d.["KeyValuePairs"])

let kvpairs = JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>(json) 
           |> (fun d -> d.["KeyValuePairs"])

let kvpairs = 
    JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>(json) 
    |> (fun d -> d.["KeyValuePairs"])

会奏效。