如何处理fsharp.data jsonprovider中缺少的属性



假设有这样的提供商:

type ColorProvider = JsonProvider<"""
{
    "id": "b35b5bcf-761a-4e50-9ff0-4c7de7dd0e5d",
    "color": "Red"
}
""">

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

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

有一个jsonvalue.null可以比较,但是在这种情况下,它不是零,属性只是缺少。

如何在没有颜色属性的情况下滤除项目?

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

type ColorProvider = JsonProvider<"""[
  { "id": "b35b5bcf", "color": "Red" },
  { "id": "b2542345" } ]""", SampleIsList=true>

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

来很好地处理它。
dataAccess.QueryAsEnumerable<string>("SELECT Data FROM Objects")
|> Seq.map ColorProvider.Parse
|> Seq.iter (fun item -> printfn "%s" (defaultArg item.Color " - "))

好吧,在这里找到它:

dataAccess.QueryAsEnumerable<string>("SELECT Data FROM Objects")
|> Seq.map ColorProvider.Parse
|> Seq.iter (fun item ->
    match item.JsonValue.TryGetProperty("color") with
    | Some color -> printfn "%A" color
    | None -> printfn "%s" " - "
)

最新更新