2013-07-21 26 views
8

Với mã:JsonProvider "Đây không phải là một biểu thức hằng hoặc giá trị thuộc tính tùy chỉnh hợp lệ"

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

Dòng cuối cùng giữ cho tôi lỗi "Đây không phải là một biểu thức hằng hoặc tùy chỉnh hợp lệ giá trị thuộc tính" - - điều đó nghĩa là gì? Làm thế nào tôi có thể làm cho nó đọc JSON này?

Trả lời

14

Chuỗi phải được đánh dấu là hằng số. Để làm điều đó, hãy sử dụng the [<Literal>] attribute. Ngoài ra, các nhà cung cấp loại tạo ra một loại, không phải là một giá trị, vì vậy bạn cần phải sử dụng type thay vì let:

open FSharp.Data 

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

type Schema = JsonProvider<testJson> 
+0

Cảm ơn thông tin này. Tôi tò mò nếu bất cứ ai có thể giải thích chi tiết tại sao bạn phải đánh dấu một giá trị mà đã không thay đổi như một hằng số. Điều gì đang thực sự xảy ra ở đây? EDIT: nevermind, tôi nhận được nó. Rõ ràng điều này có để tất cả giải quyết lúc 'biên dịch' thời gian, không phải thời gian chạy. – jackmott

0

Có thể xem JsonProvider làm trình phân tích cú pháp JSON được tham số (cộng với kiểu dữ liệu mà trình phân tích cú pháp tạo) chuyên về thời gian biên dịch.

Tham số bạn cung cấp cho nó (một chuỗi hoặc một đường dẫn đến tệp JSON) xác định cấu trúc của dữ liệu JSON - lược đồ nếu bạn muốn. Điều này cho phép nhà cung cấp tạo ra một kiểu sẽ có tất cả các thuộc tính mà dữ liệu JSON của bạn cần, tĩnh và tập hợp các thuộc tính đó (cùng với các kiểu tương ứng của chúng) được xác định (thực sự suy ra) với mẫu JSON mà bạn cung cấp cho nhà cung cấp.

Vì vậy, cách chính xác để sử dụng JsonProvider được trình bày trong một trong những ví dụ từ các tài liệu:

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

Ví dụ được lấy từ here.

+0

Yeah, ngoại trừ việc bạn * có thể * Sử dụng một biến, nó chỉ có thể được đánh dấu là không đổi. – svick

+1

@svick, vâng, có thuộc tính 'Literal' cho phép tạo ra cái gọi là literals. Nhưng như bạn nói, nó làm cho 'biến' thành 'hằng số', một chút mâu thuẫn, bạn có đồng ý không? :) – MisterMetaphor

+0

Vâng, nhưng tôi không biết về một thuật ngữ tốt có thể mô tả cả hai biến và hằng số. – svick

Các vấn đề liên quan