如何处理 FSharp.Data JsonProvider 中缺少的属性?

Nik*_*lia 3 f# f#-data fsharp.data.typeproviders

假设有一个这样的提供者:

type ColorProvider = JsonProvider<"""
{
    "id": "b35b5bcf-761a-4e50-9ff0-4c7de7dd0e5d",
    "color": "Red"
}
""">
Run Code Online (Sandbox Code Playgroud)

如果这些对象之一根本没有 color 属性,则尝试从集合中打印颜色将失败:

dataAccess.QueryAsEnumerable<string>("SELECT Data FROM Objects")
|> Seq.map ColorProvider.Parse
|> Seq.iter (fun item -> printfn "%A" item.Color)
Run Code Online (Sandbox Code Playgroud)

有一个 JsonValue.Null 可以比较,但在这种情况下它不是空的,只是缺少该属性。

如何过滤掉没有颜色属性的项目?

Tom*_*cek 5

您的解决方案TryGetProperty有效,但有更好的方法 - 您可以使用更具代表性的样本,其中包含两个记录,其中color一个缺少属性:

type ColorProvider = JsonProvider<"""[
  { "id": "b35b5bcf", "color": "Red" },
  { "id": "b2542345" } ]""", SampleIsList=true>
Run Code Online (Sandbox Code Playgroud)

然后,Color属性被推断为option<string>,您可以使用选项的模式匹配或使用defaultArg

dataAccess.QueryAsEnumerable<string>("SELECT Data FROM Objects")
|> Seq.map ColorProvider.Parse
|> Seq.iter (fun item -> printfn "%s" (defaultArg item.Color " - "))
Run Code Online (Sandbox Code Playgroud)