2013-07-21 13 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 डेटा के सभी गुण होंगे, स्थिर रूप से, और उन गुणों के सेट (उनके संबंधित प्रकारों के साथ) को जेएसओएन नमूना के साथ परिभाषित किया गया है (वास्तव में अनुमानित) प्रदाता।

तो 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

@ एसविक, हां, वहां 'लिटरल' विशेषता है जो तथाकथित नामित अक्षर बनाने की अनुमति देती है। लेकिन जैसा कि आप कहते हैं, यह 'चर' को 'स्थिर' बनाता है, जो थोड़ा विरोधाभासी है, क्या आप सहमत नहीं हैं? :) – MisterMetaphor

+0

हाँ, लेकिन मुझे एक अच्छी अवधि के बारे में पता नहीं है जो चर और स्थिरांक दोनों का वर्णन करेगा। – svick

संबंधित मुद्दे

 संबंधित मुद्दे