鉴于代码:
#if INTERACTIVE
#r "bin\Debug\FSharp.Data.dll"
#endif
open System
open FSharp.Data
open FSharp.Data.Json
let testJson = """{ "workingDir":"hello", "exportDir":"hi there", "items":[{ "source":"", "dest":"", "args": {"name":"that"} }] }"""
//here is where i get the error
let Schema = JsonProvider<testJson>
最后一行不断给出错误“这不是常量表达式或有效的自定义属性值” - 这是什么意思?我怎样才能读到这个JSON?
答案 0 :(得分:14)
字符串必须标记为常量。为此,请使用the [<Literal>]
attribute。此外,类型提供程序会创建一个类型,而不是值,因此您需要使用type
而不是let
:
open FSharp.Data
[<Literal>]
let testJson = """{ "workingDir":"hello", "exportDir":"hi there", "items":[{ "source":"", "dest":"", "args": {"name":"that"} }] }"""
type Schema = JsonProvider<testJson>
答案 1 :(得分:0)
可以将JsonProvider
视为参数化的JSON解析器(加上解析器生成的数据类型),该解析器专门用于编译时。
您给它的参数(字符串或JSON文件的路径)定义了JSON数据的结构 - 如果您愿意,可以定义模式。这允许提供程序创建一个类型,该类型将具有JSON数据应具有的所有属性,静态,并且这些属性的集合(以及它们各自的类型)是使用您提供给的JSON样本定义的(实际推断出来的)提供者。
因此,文档中的一个示例中显示了使用JsonProvider
的正确方法:
// generate the type with a static Parse method with help of the type provider
type Simple = JsonProvider<""" { "name":"John", "age":94 } """>
// call the Parse method to parse a string and create an instance of your data
let simple = Simple.Parse(""" { "name":"Tomas", "age":4 } """)
simple.Age
simple.Name
该示例来自here。