f# - 如何将字符串解析为任何 F# 数据?

标签 f# f#-data

在 F# 中,任何数据都可以通过函数 sprintf 进行字符串化,如下所示:

type someKindOfDataType = ...
let data : someKindOfDataType = ...
sprintf "%A" data

我们可以有一个反转函数来将字符串解析回 someKindOfDataType,如下所示:?

let parse<'someKingOfDataType> (s:string) : someKindOfDataType = ....

就像 JavaScript 中的 JSON.parse 一样?

最佳答案

您正在描述通常所说的序列化 - 从内存中的数据结构转换为可以通过网络传输的表示形式,可以是 XML、JSON、二进制等。 - 和反序列化 - 相反。

sprintf "%A" 旨在提供方便的数据可视化表示,通常仅用于开发目的,而不是用于生产。它实际上并不进行序列化,因为无法反序列化。

如果您想将 F# 数据序列化为字符串,我建议通过库使用 JSON,例如 Newtonsoft.Json .

请注意,这不会产生与 F# 源代码类似的字符串,如 sprintf "%A" 那样,因为目的不同。一个例子:

Newtonsoft.Json.JsonConvert.SerializeObject [|Some 3; None|]
// """[{"Case":"Some","Fields":[3]},null]"""

Newtonsoft.Json.JsonConvert.DeserializeObject<int option []> """[{"Case":"Some","Fields":[3]},null]"""
// [|Some 3; None|]

您需要提供要反序列化的类型,如果字符串不表示该类型的有效实例,则此操作可能会引发异常。

关于f# - 如何将字符串解析为任何 F# 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46455400/

相关文章:

f# - 事件模式的重点是什么?

generics - F# 代码引用和泛型函数

f# - FSharp.Data : Use SqlDataProvider without database

struct - 如何在 F# 中为结构体定义一个 ctor,进而调用该结构体的默认 ctor

f# - 如何创建带有 printf 样式日志参数的 F# 函数?

csv - 来自 FSharp.Data 的 CSV typeprovider 的性能问题

f# - Json Provider 可以反序列化为 Generic.Dictionary 吗?

csv - Deedle:使用 SaveCsv 时设置标题名称

f# - f# 4.0 是否支持 .net 3.5?

web-services - F# WsdlTypeProvider MaxReceivedMessageSize