Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何动态使用FSharp.Data.JsonProvider?_F#_F# Data - Fatal编程技术网

F# 如何动态使用FSharp.Data.JsonProvider?

F# 如何动态使用FSharp.Data.JsonProvider?,f#,f#-data,F#,F# Data,我正在使用FSharp.Data.JsonProvider解析JSON文件。 从…起 我必须像这样声明类型 type Simple = JsonProvider<"path/to/simple/json.json"> type Simple=JsonProvider 但是我想让JsonProvider更加灵活。 我所说的灵活的意思是像下面这样声明 let x = "path/to/simple/json.json" type Simple = JsonProvider<x&

我正在使用FSharp.Data.JsonProvider解析JSON文件。 从…起 我必须像这样声明类型

type Simple = JsonProvider<"path/to/simple/json.json">
type Simple=JsonProvider
但是我想让JsonProvider更加灵活。 我所说的灵活的意思是像下面这样声明

let x = "path/to/simple/json.json"
type Simple = JsonProvider<x>
let x=“path/to/simple/json.json”
类型Simple=JsonProvider
因此,JsonProvider可以处理各种json文件,而不仅仅是特定的文件


我该怎么做?或者,还有其他方法吗?

如果您的文件具有相同的形状(即相同的字段和字段类型),则可以使用其中一个作为类型参数,然后将其他方法传递给
Parse

open System.IO

type Simple = JsonProvider<"file1.json">

let value1 = Simple.GetSample()
let value2 = Simple.Parse(File.ReadAllText "file2.json")
opensystem.IO
类型Simple=JsonProvider
让value1=Simple.GetSample()
让value2=Simple.Parse(File.ReadAllText“file2.json”)

编辑:如果它们没有相同的形状怎么办?嗯,有两种情况

如果它们有细微的差别,比如一些字段可能存在或不存在,或者可能是字符串或数字,那么您可以制作一个样本文件,该文件是一个样本数组,并使用
JsonProvider
。生成的类型将使用可选值来适应差异


如果它们完全不同,那么JsonProvider根本就不是适合这项工作的工具。JsonProvider的目的是提供一个很好的API,当您提前知道JSON将具有什么形状时,可以读取JSON。如果您不这样做,那么您应该使用具有文档类型的通用JSON解析器,如System.Text.JSON的JsonDocument或Newtonsoft.JSON的JObject。我想如果你真的想继续使用JsonProvider,你也可以在幕后使用JsonProvider使用的文档类型(称为JsonValue)。

如果他们不这样做怎么办?@JoshDruge编辑了这个案例的答案。