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

Bra*_*mir 2 f# json type-providers

我使用 F# 和 JSON 类型提供程序以 JSON 格式解析一些数据。

示例.json:

{
    "contracts": {
        "11": {
            "id": 11,
            "date": "08.01.2021"
        },
        "12": {
            "id": 12,
            "date": "09.01.2021"
        },
        "13": {
            "id": 13,
            "date": "11.01.2021"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的 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``
Run Code Online (Sandbox Code Playgroud)

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

有没有办法使用 JsonProvider 或一些 F# 法术将这个结构转换为序列?

bri*_*rns 5

您可以通过基础 来做到这一点JsonValue,这JsonProvider是建立在:

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

JsonProvider但是,在这种情况下根本没有使用价值。你最好跳过它,而是动态运行解析器:

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

这样一来,你不是依靠JSON总是由恰好合同111213