首页 文章

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

提问于
浏览
3

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

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

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

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

有一个JsonValue.Null要比较,但在这种情况下,它不是null,属性只是缺少 .

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

2 回答

  • 1

    您使用 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 " - "))
    
  • 4

    好的,发现它here

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

相关问题