解析 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
应该有两个属性 - Record
和 Array
- 都是可选的。如果值是一条记录,第一个将是 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
我有一个 JSON 输入,我想使用 Fsharp.Data 在 F# 中解析,它看起来像这样:-
[
{
"Server": "ServerName1",
"CNAME": [ "cname1", "cname2"]
},
{
"Server": "ServerName2",
"CNAME": {}
}
]
请注意空数组返回为 {} 而不是 [] 的方式,遗憾的是我无法更改此设置。
当我用 Fsharp.Data 解析它时,CName 属性 是 ArrayOrCname 类型(这是有道理的)。
如何在 F# 中确定我有一个数组还是一个空的 CName 记录?
生成的类型 ArrayOrCname
应该有两个属性 - Record
和 Array
- 都是可选的。如果值是一条记录,第一个将是 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