如何处理 FSharp.Data JsonProvider 中缺少的属性?
How to deal with missing properties in 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 可以与之比较,但在本例中它不为空,只是缺少 属性。
如何过滤掉没有颜色 属性 的项目?
好的,找到了 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" " - "
)
您使用 TryGetProperty
的解决方案有效,但还有更好的方法 - 您可以使用包含两条记录的更具代表性的样本,其中一条记录缺少 color
属性 :
type ColorProvider = JsonProvider<"""[
{ "id": "b35b5bcf", "color": "Red" },
{ "id": "b2542345" } ]""", SampleIsList=true>
然后,Color
属性 被推断为 option<string>
,您可以使用选项上的模式匹配或使用 defaultArg
:[=17 来很好地处理它=]
dataAccess.QueryAsEnumerable<string>("SELECT Data FROM Objects")
|> Seq.map ColorProvider.Parse
|> Seq.iter (fun item -> printfn "%s" (defaultArg item.Color " - "))
假设有这样的提供商:
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 可以与之比较,但在本例中它不为空,只是缺少 属性。
如何过滤掉没有颜色 属性 的项目?
好的,找到了 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" " - "
)
您使用 TryGetProperty
的解决方案有效,但还有更好的方法 - 您可以使用包含两条记录的更具代表性的样本,其中一条记录缺少 color
属性 :
type ColorProvider = JsonProvider<"""[
{ "id": "b35b5bcf", "color": "Red" },
{ "id": "b2542345" } ]""", SampleIsList=true>
然后,Color
属性 被推断为 option<string>
,您可以使用选项上的模式匹配或使用 defaultArg
:[=17 来很好地处理它=]
dataAccess.QueryAsEnumerable<string>("SELECT Data FROM Objects")
|> Seq.map ColorProvider.Parse
|> Seq.iter (fun item -> printfn "%s" (defaultArg item.Color " - "))