JsonProvider“这不是常量表达式或有效的自定义属性值”

时间:2013-07-21 11:53:59

标签: f# f#-interactive type-providers f#-data

鉴于代码:

#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?

2 个答案:

答案 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