有Deedle(F#)的JSON类型提供程序:如何在HD上读取多个JSON文件?
问题描述:
假设我有很多文件与相同保存在我的HD上的JSON格式。有Deedle(F#)的JSON类型提供程序:如何在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
请注意,这些并不总是严格执行架构。例如,字符串类型值允许丢失,并且将被空字符串静静地替换;额外的数据被允许存在,并将被加载到JsonValue
数据中,但通过静态类型的属性不可访问,等等。