【问题标题】:F# Generic FunctionF# 通用函数
【发布时间】:2017-04-18 19:07:15
【问题描述】:

piping to/from net objects

我知道我可以这样做:

let jsonDeserialize json = JsonConvert.DeserializeObject<Dictionary<System.String, System.String>>(json)

然后将序列化的 Json 键/值对通过管道传输到 jsonDeserialize。它运作良好。我的下一个问题是我可以通用化对 JsonConvert.DeserializeObject 的调用吗?我想使用它,以便我可以反序列化为具有相同功能的其他类型。

我试过了

let jsonDeserialize json mytype : 'a  = JsonConvert.DeserializeObject<'a>(json)

但后来不知道如何使用它。给定我想要的序列化 JSON 字符串

let jsDeser = 
    jsonSerialized
    |> jsonDeserialize Dictionary<string, string>

或类似的东西,在惯用的 F# 中

【问题讨论】:

    标签: .net json f#


    【解决方案1】:

    在 F# 中,类型参数在尖括号中指定和传递:

    let jsonSerialize<'mytype> json : 'mytype = JsonConvert.DeserializeObject<'mytype> json
    
    let jsDeser = jsonSerialized |> jsonDeserialize<Dictionary<string, string>>
    

    或者,最好根本不指定它们,而是让编译器从上下文中找出它们:

    let jsonSerialize json = JsonConvert.DeserializeObject<'a> json
    
    let jsDeser : Dictionary<string, string> = jsonDeserialize jsonSerialized
    

    注意:您必须在 JsonConvert.DeserializeObject 上指定泛型参数,因为它有一个非泛型重载,如果您不指定任何内容,它将被选中。

    【讨论】:

    • 我想你的意思是let jsonSerialize&lt;'mytype&gt; json : 'mytype = JsonConvert.DeserializeObject&lt;'mytype&gt; json
    • 是的,这是一个错字。谢谢。
    • 我认为我们可以删除返回类型let jsonSerialize&lt;'mytype&gt; json = JsonConvert.DeserializeObject&lt;'mytype&gt; json,但我认为我们不能从函数let jsonSerialize json = JsonConvert.DeserializeObject&lt;'a&gt; json 中删除类型定义。让我知道这是否编译;我认为编译器不会理解'a 的意思。
    • 选项 1 效果很好,选项 2 需要帮助。因为我想通过管道传输结果来创建地图。我有:let jsonDeserialize2 json = JsonConvert.DeserializeObject&lt;'a&gt; json,后跟:let parmMap2 = (let parmMapDict : ParameterDict = jsonDeserialize2 jsonParms parmMapDict) |&gt; Seq.map (|KeyValue|) |&gt; Map.ofSeq,它有效,但看起来不如选项 1
    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    相关资源
    最近更新 更多