2016-03-07 9 views
6

करने के लिए एक मामला वर्ग कन्वर्ट करने के लिए मैं एक मामले वर्ग है कहोसबसे अच्छा तरीका है एक js.Object

@js.native 
trait MyJSObject extends js.Object { 
    def add(name: js.Object): Unit = js.native 
} 

ऐसी है कि नाम की होनी चाहिए प्रारूप

{"first":"John","last":"Doe"} 

का सबसे अच्छा तरीका एक js.Object को मेरे मामले वस्तु कन्वर्ट करने के लिए क्या है?

मैं यह जानता हूँ एक upickle.write() यह एक json स्ट्रिंग में बदलने के लिए तो मुझे लगता है कि मेरे सवाल है इस का सबसे अच्छा तरीका है कर प्राप्त किया जा सकता?

+0

बेतकल्लुफ़, मुझे लगता है यह है कि upickle.write सबसे * सुविधाजनक * जिस तरह से यह से निपटने के लिए। आप शायद कुछ हद तक एक अधिक सुरुचिपूर्ण समाधान निराकार का उपयोग कर प्राप्त कर सकते हैं, लेकिन यह बहुत स्पष्ट लाभ के बिना बहुत अधिक प्रयास होगा ... –

+0

कहा करने के बाद कि कैसे एक एक js.Object को एक json स्ट्रिंग परिवर्तित करता है? – user79074

+0

ने इसे स्वयं नहीं किया है, लेकिन मुझे संदेह है कि js.eval (स्ट्रिंग) चाल करेगा। –

उत्तर

4

आप मामले वर्ग को नियंत्रित करते हैं, तो आप सिर्फ @JSExportAll एनोटेशन इसे करने के लिए जोड़ सकते हैं:

@JSExportAll 
case class Name(first: String, last: String) 

यह first और last नामित गुण पैदा करेगा। ध्यान दें कि यह एक साधारण वस्तु के समान नहीं है। हालांकि, क्या add विधि करता है पर निर्भर करता है, यह पर्याप्त (और JSON को बदलने और फिर से पार्स करने की तुलना में अधिक हल्के) है।

मामले आप मामले वर्ग संकलन पार करने की जरूरत है, तो आप अपने JVM परियोजना में scalajs-stubs पुस्तकालय शामिल कर सकते हैं। यह डमी एनोटेशन प्रदान करेगा (जो .class फाइलों पर नहीं लिखे गए हैं)।

@js.native 
trait Options extends js.Object { 
    def first: String = js.native 
    def last: String = js.native 
} 

val x = Name("foo", "bar") 
js.use(x).as[Options] 

js.use(x).as कॉल विफल हो जाएगा:

val x = Name("foo", "bar") 
js.use(x).as[js.Object] 

यह भी एक ऐसी विशेषता है जो खेतों आप की जरूरत को परिभाषित करता है के साथ काम करेंगे:

आप एक js.Object की जरूरत है, तो आप निर्यात typechecker उपयोग कर सकते हैं , अगर वहाँ प्रकार के बीच एक बेमेल है (यानी अगर Options एक क्षेत्र है कि Name परिभाषित नहीं करता है परिभाषित करता है)।

+1

लेकिन मैं नाम उदाहरण को js.Object में कैसे परिवर्तित करूं? – user79074

+1

और यह समाधान मेरे मामले में काम नहीं करेगा, क्योंकि मेरा केस क्लास भी जेवीएम पक्ष पर उपयोग किया जाता है। इसलिए यदि मैं इसे सही ढंग से समझता हूं तो मैं scala.scalajs पैकेज में कोई संदर्भ नहीं दे सकता। – user79074

+0

मेरा जवाब अपडेट किया गया। उम्मीद है कि यह अब स्पष्ट है। – gzm0

1
uPickle साथ

:

val jsValue: Js.Value = upickle.Types.writeJs[Name](n1) 
val jsObject: js.Any = upickle.json.writeJs(jsValue).asInstanceOf[js.Any] 
संबंधित मुद्दे