如何动态使用FSharp.Data.JsonProvider?
How to use FSharp.Data.JsonProvider dynamically?
我正在使用 FSharp.Data.JsonProvider 解析 JSON 文件。
来自 http://fsharp.github.io/FSharp.Data/library/JsonProvider.html,
我必须这样声明类型。
type Simple = JsonProvider<"path/to/simple/json.json">
但我想让 JsonProvider 更灵活。
我所说的灵活的意思是像下面这样声明。
let x = "path/to/simple/json.json"
type Simple = JsonProvider<x>
因此,JsonProvider 可以处理各种 json 文件,而不仅仅是特定的文件。
我该怎么做?或者,还有其他方法吗?
如果你的文件具有相同的形状(即相同的字段和字段类型),那么你可以使用一个作为类型参数,然后将其他的传递给 Parse
:
open System.IO
type Simple = JsonProvider<"file1.json">
let value1 = Simple.GetSample()
let value2 = Simple.Parse(File.ReadAllText "file2.json")
编辑:如果它们的形状不同怎么办?嗯,有两种情况。
如果它们有细微差别,比如某些字段可能存在或不存在,或者可能是字符串或数字,那么您可以制作一个示例文件,它是一个示例数组并使用 JsonProvider<"sample.json", SampleIsList = true>
.生成的类型将使用可选值来适应差异。
如果它们完全不同,那么 JsonProvider 根本不是完成这项工作的正确工具。 JsonProvider 的目的是在您事先知道它将具有什么形状时,提供一个很好的 API 来读取 JSON。如果不这样做,那么您应该改用具有文档类型的通用 JSON 解析器,例如 System.Text.Json 的 JsonDocument 或 Newtonsoft.Json 的 JObject。我想如果你真的想继续使用 JsonProvider,你也可以使用 JsonProvider 在幕后使用的文档类型(称为 JsonValue)。
我正在使用 FSharp.Data.JsonProvider 解析 JSON 文件。 来自 http://fsharp.github.io/FSharp.Data/library/JsonProvider.html, 我必须这样声明类型。
type Simple = JsonProvider<"path/to/simple/json.json">
但我想让 JsonProvider 更灵活。 我所说的灵活的意思是像下面这样声明。
let x = "path/to/simple/json.json"
type Simple = JsonProvider<x>
因此,JsonProvider 可以处理各种 json 文件,而不仅仅是特定的文件。
我该怎么做?或者,还有其他方法吗?
如果你的文件具有相同的形状(即相同的字段和字段类型),那么你可以使用一个作为类型参数,然后将其他的传递给 Parse
:
open System.IO
type Simple = JsonProvider<"file1.json">
let value1 = Simple.GetSample()
let value2 = Simple.Parse(File.ReadAllText "file2.json")
编辑:如果它们的形状不同怎么办?嗯,有两种情况。
如果它们有细微差别,比如某些字段可能存在或不存在,或者可能是字符串或数字,那么您可以制作一个示例文件,它是一个示例数组并使用 JsonProvider<"sample.json", SampleIsList = true>
.生成的类型将使用可选值来适应差异。
如果它们完全不同,那么 JsonProvider 根本不是完成这项工作的正确工具。 JsonProvider 的目的是在您事先知道它将具有什么形状时,提供一个很好的 API 来读取 JSON。如果不这样做,那么您应该改用具有文档类型的通用 JSON 解析器,例如 System.Text.Json 的 JsonDocument 或 Newtonsoft.Json 的 JObject。我想如果你真的想继续使用 JsonProvider,你也可以使用 JsonProvider 在幕后使用的文档类型(称为 JsonValue)。