有没有办法使用 F# JsonProvider 枚举 JSON 属性?

Is there a way to enumerate JSON properties using F# JsonProvider?

我使用 F# 和 JSON Type Provider 解析了一些 JSON 格式的数据。

example.json:

{
    "contracts": {
        "11": {
            "id": 11,
            "date": "08.01.2021"
        },
        "12": {
            "id": 12,
            "date": "09.01.2021"
        },
        "13": {
            "id": 13,
            "date": "11.01.2021"
        }
    }
}

我的 F# 代码:

namespace Analyse
open Microsoft.FSharp.Reflection

module AnalyserExample =
open System
open FSharp.Data

let [<Literal>] SampleFile = @"example.json"
type ContractsProvider = JsonProvider<SampleFile>

let contracts () =
    let data = ContractsProvider.Parse("example.json")
    let contracts = data.Contracts
    contracts.``11``
    contracts.``12``
    contracts.``13``

JsonProvider 按预期工作,每个合同都被解析为一个字段,但我想枚举它们。 我有一些选择。在类型提供程序初始化运行之前使用反射获取字段列表或使用一些自定义转换来转换 JSON,但我都不喜欢它们。

有没有办法使用 JsonProvider 或某些 F# 魔法将此结构转换为序列?

您可以通过底层 JsonValue 执行此操作,这是 JsonProvider 的基础:

let data = ContractsProvider.Parse(sample)
let contracts = data.Contracts
for _, value in contracts.JsonValue.Properties() do
    printfn "%A" value

不过,在这种情况下使用 JsonProvider 几乎没有什么价值。你最好跳过它,运行 动态解析器​​:

let data = JsonValue.Load("example.json")
for _, value in data.["contracts"].Properties() do
    printfn "%A" value

这样一来,您就不会依赖 JSON 始终完全包含合同 111213