2013-07-21 1 views
8

을 :JsonProvider "이것은 상수 표현식이 아니거나 유효 사용자 정의 속성 값"코드를 감안할 때

마지막 줄에 "이것은 속성 값을 상수 표현식 또는 유효 사용자 정의하지 않습니다"나에게 오류를주고 유지
#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을 읽으려면 어떻게해야합니까?

답변

14

문자열을 상수로 표시해야합니다. 그렇게하려면 the [<Literal>] attribute을 사용하십시오. 또한, 유형 공급자 유형이 아닌 가치를 창조하는, 그래서 당신은 let 대신 type를 사용해야합니다 :

open FSharp.Data 

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

type Schema = JsonProvider<testJson> 
+0

이 정보를 제공해 주셔서 감사합니다. 누구든지 왜 상수로 불변의 값을 표시해야 하는지를 자세히 설명 할 수 있다면 궁금합니다. 여기서 실제로 무슨 일이 일어나고있는거야? 편집 : 신경 쓰지 마, 알았어. 분명히 이것은 모든 컴파일 시점에서 해결되어야한다. 런타임은 아니다. – jackmott

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에서 촬영했다.

+0

네를, 당신이 * * 변수를 사용할 수 있다는 점을 제외, 그냥 상수로 표시되어야한다. – svick

+1

@svick, 네, 소위 명명 된 리터럴을 만들 수있는'Literal' 속성이 있습니다. 그러나 당신이 말한 것처럼, 그것은 '변수'를 '상수'로 만듭니다. 이것은 약간 모순입니다. 당신은 동의하지 않습니까? :) – MisterMetaphor

+0

그래,하지만 변수와 상수 모두를 설명하는 좋은 용어에 대해서는 모른다. – svick