有没有一种方法可以使用F#JsonProvider枚举JSON属性



我使用F#和JSON类型提供程序以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组成。

最新更新