解析 Fsharp.Data JsonProvider 中的混合类型

Parsing Mixed Types in Fsharp.Data JsonProvider

我有一个 JSON 输入,我想使用 Fsharp.Data 在 F# 中解析,它看起来像这样:-

[
    {
        "Server": "ServerName1",
        "CNAME": [ "cname1", "cname2"]
    },
    {
        "Server": "ServerName2",
        "CNAME": {}
    }
]

请注意空数组返回为 {} 而不是 [] 的方式,遗憾的是我无法更改此设置。

当我用 Fsharp.Data 解析它时,CName 属性 是 ArrayOrCname 类型(这是有道理的)。

如何在 F# 中确定我有一个数组还是一个空的 CName 记录?

生成的类型 ArrayOrCname 应该有两个属性 - RecordArray - 都是可选的。如果值是一条记录,第一个将是 Some,另一个将是 None,反之亦然。因此,您可以使用模式匹配来处理这个问题。使用您的示例:

#r "nuget: FSharp.Data"
open FSharp.Data

type T = FSharp.Data.JsonProvider<"""[
  { "Server": "ServerName1",
    "CNAME": [ "cname1", "cname2"] },
  { "Server": "ServerName2",
    "CNAME": {} } ]""">

我们现在可以获得样本数据(只是为了测试这个)和 Cname:

属性的模式匹配
let servers = T.GetSamples()
for server in servers do
  match server.Cname.Record, server.Cname.Array with
  | Some recd, _ -> 
      printfn "empty record"
  | _, Some arr ->
      printfn "names: %A" arr
  | _ -> 
      failwith "This should never happen"

如果你只是想知道这个值是否是一个数组,你可以定义一个简单的助手,将 ArrayOrCname 变成一个选项:

let asOption (v:T.ArrayOrCname) = 
  match v.Record, v.Array with
  | _, Some arr -> Some arr
  | _ -> None