10

Given the code:

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

The last line keeps giving me the error "This is not a constant expression or valid custom attribute value"-- what does that mean? How can i get it to read this JSON?

4

2 回答 2

16

该字符串必须标记为常量。为此,请使用 [<Literal>]属性。此外,类型提供程序创建一个类型,而不是一个值,因此您需要使用type而不是let

open FSharp.Data

[<Literal>]
let testJson = """{ "workingDir":"hello", "exportDir":"hi there", "items":[{ "source":"", "dest":"", "args": {"name":"that"} }] }"""

type Schema = JsonProvider<testJson>
于 2013-07-21T12:29:41.393 回答
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

该示例取自此处

于 2013-07-21T12:28:05.627 回答