使用Fsharp.Data JsonProvider判断混合类型CNAME字段类型的方法
解决方案
FSharp.Data 的 JsonProvider 针对同字段多类型的场景,会自动生成带判别标签的联合类型,你遇到的 ArrayOrCname 就是这类自动生成的联合类型,直接用模式匹配即可区分两种情况:
第一步:定义解析类型
open FSharp.Data // 直接用你的JSON样本生成强类型解析器 type ServerConfig = JsonProvider<""" [ { "Server": "ServerName1", "CNAME": [ "cname1", "cname2"] }, { "Server": "ServerName2", "CNAME": {} } ] """>
第二步:模式匹配区分类型
// 解析你的数据源字符串 let configs = ServerConfig.Parse(你的数据源JSON字符串) for item in configs do match item.CNAME with | ServerConfig.Array cnameArr -> // 匹配到数组场景,cnameArr 就是 string[] 类型,可以直接遍历 printfn $"服务器{item.Server} 绑定的CNAME:%A{cnameArr}" | ServerConfig.Cname emptyObj -> // 匹配到空对象场景,对应无CNAME的情况 printfn $"服务器{item.Server} 未配置CNAME"
可选优化:统一转成数组
如果不想每次都做模式匹配,可以加扩展方法把两种情况统一返回数组,后续调用更方便:
type ServerConfig.Root with /// 统一获取CNAME数组,空对象场景返回空数组 member this.GetCnameList() = match this.CNAME with | ServerConfig.Array arr -> arr | _ -> [||]
注:如果自动生成的联合类型case名称和示例不一致,把鼠标悬浮到
CNAME属性上查看类型定义,替换成你本地实际生成的case名即可。
内容的提问来源于stack exchange,提问作者David Hayes
相关产品推荐
相关产品推荐

