JSON 带 Deedle 的类型提供程序 (F#):如何在 HD 上读取多个 JSON 文件?
JSON Type provider with Deedle (F#): how to read several JSON files on HD?
假设我有很多相同JSON格式的文件保存在我的硬盘上。
我可以通过以下方式恢复样本:
type TypeA = JsonProvider<".../Documents/FileA.json">
let sampleA = TypeA.GetSamples()
但是如果我有很多文件(例如它们在列表中的名称),我该如何恢复所有样本?
JsonProvier
提供了多种方法,用于将运行时提供的数据解析为所提供类型提供的数据类型:
//Load from named file/website
member this.Load(uri: string): this.Root[]
//Load data from stream source
member this.Load(reader: System.IO.TextReader): this.Root[]
member this.Load(stream: System.IO.Stream): this.Root[]
//Load data from named file/website (async)
member this.AsyncLoad(uri: string): Async<this.Root[]>
//Load data directly from string
member this.Parse(text: string): this.Root[]
这些都会将相关数据加载到类型提供程序的静态参数生成的类型数组中。例如:
open FSharp.Data
type TypeA = JsonProvider<"C:\DataTemp\FileA.json">
let directory = "C:\DataTemp\"
let files: string[] =
[|
"FileA.json"
"FileB.json"
"FileC.json"
"FileD.json"
|]
[<EntryPoint>]
let main argv =
let sampleA = TypeA.GetSamples()
let sampleB = TypeA.Load(directory+"FileB.json")
let allData = files |> Array.collect (fun f -> TypeA.Load(directory+f))
for d in allData do
printfn "%A" d
//etc
0
请注意,这些并不总是严格执行架构。比如string类型的值是允许缺失的,会默默的被空字符串代替;允许存在额外数据,并将加载到 JsonValue
数据中,但无法通过静态类型属性等访问。
假设我有很多相同JSON格式的文件保存在我的硬盘上。
我可以通过以下方式恢复样本:
type TypeA = JsonProvider<".../Documents/FileA.json">
let sampleA = TypeA.GetSamples()
但是如果我有很多文件(例如它们在列表中的名称),我该如何恢复所有样本?
JsonProvier
提供了多种方法,用于将运行时提供的数据解析为所提供类型提供的数据类型:
//Load from named file/website
member this.Load(uri: string): this.Root[]
//Load data from stream source
member this.Load(reader: System.IO.TextReader): this.Root[]
member this.Load(stream: System.IO.Stream): this.Root[]
//Load data from named file/website (async)
member this.AsyncLoad(uri: string): Async<this.Root[]>
//Load data directly from string
member this.Parse(text: string): this.Root[]
这些都会将相关数据加载到类型提供程序的静态参数生成的类型数组中。例如:
open FSharp.Data
type TypeA = JsonProvider<"C:\DataTemp\FileA.json">
let directory = "C:\DataTemp\"
let files: string[] =
[|
"FileA.json"
"FileB.json"
"FileC.json"
"FileD.json"
|]
[<EntryPoint>]
let main argv =
let sampleA = TypeA.GetSamples()
let sampleB = TypeA.Load(directory+"FileB.json")
let allData = files |> Array.collect (fun f -> TypeA.Load(directory+f))
for d in allData do
printfn "%A" d
//etc
0
请注意,这些并不总是严格执行架构。比如string类型的值是允许缺失的,会默默的被空字符串代替;允许存在额外数据,并将加载到 JsonValue
数据中,但无法通过静态类型属性等访问。