gpt4 book ai didi

f# - 提供类型的模式匹配

转载 作者:行者123 更新时间:2023-12-05 00:33:33 25 4
gpt4 key购买 nike

首先,获取模式并解析:

type desc = JsonProvider< """[{"name": "", "age": 1}]""", InferTypesFromValues=true >
let json = """[{"name": "Kitten", "age": 322}]"""
let typedJson = desc.Parse(json)

现在我们可以访问 typedJson.[0] .Age 和 .Name 属性,但是,我想在编译时对它们进行模式匹配,以便在架构更改时出现错误.

由于这些属性已被删除,我们无法在运行时获取它们:

let ``returns false``() = 
typedJson.[0].GetType()
.FindMembers(MemberTypes.All, BindingFlags.Public ||| BindingFlags.Instance,
MemberFilter(fun _ _ -> true), null)
|> Array.exists (fun m -> m.ToString().Contains("Age"))

...我已经使用事件模式制作了一个运行时检查版本:

let (|Name|Age|) k = 
let toID = NameUtils.uniqueGenerator NameUtils.nicePascalName
let idk = toID k
match idk with
| _ when idk.Equals("Age") -> Age
| _ when idk.Equals("Name") -> Name
| ex_val -> failwith (sprintf "\"%s\" shouldn't even compile!" ex_val)

typedJson.[0].JsonValue.Properties()
|> Array.map (fun (k, v) ->
match k with
| Age -> v.AsInteger().ToString() // ...
| Name -> v.AsString()) // ...
|> Array.iter (printfn "%A")

理论上,如果 FSharp.Data 不是操作系统,我将无法实现 toID。一般来说,整个方法似乎是错误的,需要重做。

我知道使用类型提供程序无法生成可区分的联合,但也许有更好的方法在编译时进行所有这些检查?

最佳答案

据我所知,使用给定的 TP 无法在编译时查明“Json 模式已更改”。

这就是为什么:

  • JsonProvider<sample>正是在编译时启动的,提供了一种在运行时操作 Json 内容的类型。这种提供的删除类型有几个运行时静态方法,适用于任何 sample然后输入 Root扩展 IJsonDocument实例属性很少,包括基于编译时提供的示例的属性(在您的例子中 - 属性 NameAge)。只有一个非常轻松的隐式JsonProvider 后面的 Json“模式” -提供的类型,没有另一个这样的实体可以在编译时比较变化;
  • 在运行时只提供类型 desc及其静态方法及其 Root类型与相应的实例方法随时为您处理任意 Json 内容。所有这些爵士乐对于“Json 模式”,在您给定的情况下,只要运行时 Json 内容表示一个数组,它的元素几乎可以是任何一个。例如,

    type desc = JsonProvider<"""[{"name": "", "age": 1}]"""> // @ compile-time

    let ``kinda "typed" json`` = desc.Parse("""[]""") // @ run-time
    let ``another kinda "typed" json`` =
    desc.Parse("""[{"contents":"whatever", "text":"blah-blah-blah"},[{"extra":42}]]""")

    两者都将在运行时被愉快地解析为符合 TP 从给定 sample 派生的“模式”的“类型化 Json” ,虽然显然是NameAge丢失,如果访问将引发异常。

  • 构建另一个依赖正式 Json schema 的 Json TP 是可行的.它可以在类型创建时从模式存储库中使用对给定模式的引用,并允许操作元素仅通过在编译时从模式派生的提供的访问器来解析已解析的 Json 有效负载。

    在这种情况下改变如果代码中使用的访问器与更改不兼容,则引用模式可能会破坏编译。这种安排伴随着运行时 Json 有效载荷验证器或验证解析器可以提供可靠的企业质量Json 架构变更管理。

    JsonProvider TP 来自 Fsharp.Data缺乏这种 Json 模式处理能力,因此有效负载验证只能在运行时完成。

    关于f# - 提供类型的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32844423/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com