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

3

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

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可供比较,但在这种情况下它不是null,该属性只是缺失。

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

2个回答

5
你使用 `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 " - "))

那是我首先尝试的,但是我没有使用“SampleIsList=true”选项,所以失败了。好知道! - Nikolai Koudelia

1

好的,在这里找到了链接

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" " - "
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接