2015-12-17 14 views
14

साथ खेलने का उपयोग कर रहा एक को देखने के लिए यह बाद में पारित करने के लिए, मेरे नियंत्रकों में से एक में शहरों की एक सूची के साथ एक JSON फ़ाइल लोड करने के क्रम में की जरूरत है JSON फ़ाइल लोड करने के लिए कैसे।स्काला

मैं यहाँ फ़ाइल रखा है: app/assets/jsons/countriesToCities.json
(वैसे: इस एक उपयुक्त स्थान है, या मैं इसे कहीं और जगह चाहिए?)

मैं डॉक्स पढ़ लिया है और मैं इसे देख सकते हैं एक स्ट्रिंग से JsValue बनाने के लिए संभव है: https://www.playframework.com/documentation/2.4.x/ScalaJson#Using-string-parsing

मैं एक समान फैशन में JsValue बनाना चाहता हूं। अंतर यह है कि मैं सामग्री को फ़ाइल से लोड करना चाहता हूं, स्ट्रिंग से नहीं ... दुर्भाग्यवश, मुझे यह कैसे करना है इस पर कोई कोड स्निपेट नहीं मिला है।
क्या मुझे फ़ाइल को स्ट्रिंग में पढ़ने के लिए कुछ और उपयोग करना है और केवल उस स्ट्रिंग पर पार्स विधि का उपयोग करना है?

उत्तर में यह कैसे करें इस पर उदाहरण के साथ कोड स्निपेट की अत्यधिक सराहना की जाएगी! :)

अग्रिम में बहुत बहुत धन्यवाद!

+0

की संभावित डुप्लिकेट [कैसे खेलने framewor में सर्वर से एक फ़ाइल को पढ़ने के लिए के] (http://stackoverflow.com/questions/4519828/how-to-read-a-file-from-server-in-play-framework) – Rumoku

+1

वास्तव में एक डुप्लिकेट @ श्री वी नहीं। । लेकिन डायलन के जवाब के साथ, मुझे लगता है कि मैं इसे हल करने का प्रबंधन करूंगा! धन्यवाद! –

उत्तर

10

यहाँ कैसे मैं इसे हल करने में कामयाब रहे है:

val source: String = Source.fromFile("app/assets/jsons/countriesToCities.json").getLines.mkString 
val json: JsValue = Json.parse(source) 

मदद के लिए धन्यवाद! :)

+2

'Json.parse' सीधे स्ट्रीम से पढ़ सकता है, इसलिए लाइनों को प्राप्त करने के बजाय' इनपुटस्ट्रीम 'संस्करण का उपयोग करना बेहतर है, उनमें से एक स्ट्रिंग बनाना, और फिर इसे पार्स करना। – BeepDog

+0

'.getLines' यहां जरूरी नहीं है। साथ ही, 'सेफाइल' कॉल के परिणाम को बंद करना बेहतर होगा (एक 'io.Source' उदाहरण)। – acros

14

ऐसा लगता है कि संभावित डुप्लिकेट के बारे में टिप्पणी आपके ऐप/संपत्ति फ़ोल्डर से फ़ाइल को कैसे पढ़ा जाए। मेरा जवाब एक स्ट्रीम से जेसन को पार्स करने के बारे में है। दोनों को मिलाएं और आपको जाने के लिए अच्छा होना चाहिए।

Json.parse कुछ अलग तर्क प्रकार स्वीकार करता है, जिनमें से एक InputStream है।

val stream = new FileInputStream(file) 
val json = try { Json.parse(stream) } finally { stream.close() } 

पीएस जब आप लिखित दस्तावेज़ों में जो खोज रहे हैं उसे नहीं मिल पा रहे हैं, तो API Docs प्रारंभ करने के लिए एक अच्छी जगह है।

+0

'FileInputStream'' java.io' से संबंधित है, लेकिन मैं स्कैला + प्ले का उपयोग कर रहा हूं, जावा + प्ले नहीं। क्या मुझे वास्तव में 'java.io' का उपयोग करना है, या कोई अन्य तरीका है? –

+1

संक्षिप्त उत्तर नहीं है। लंबा उत्तर: स्कॉला में आईओ के लिए बहुत अंतर्निहित कार्यक्षमता नहीं है। 'Scala.io.Source' ऑब्जेक्ट आपकी सबसे नज़दीकी शर्त है - आप इसे एक स्ट्रिंग में फ़ाइल लोड करने के लिए उपयोग कर सकते हैं, फिर उस स्ट्रिंग को 'Json.parse' पर पास कर दें।आप आईओ समाधान के साथ अन्य पुस्तकालयों में भी देख सकते हैं, लेकिन यह कोड की दो पंक्तियों को बदलने के लिए बहुत अधिक प्रयास की तरह लगता है। – Dylan

+4

मुझे ध्यान रखना चाहिए कि चूंकि आप स्कैला + प्ले का उपयोग कर रहे हैं, आप वास्तव में स्कैला + जावा + प्ले का उपयोग कर रहे हैं। आप अभी भी स्कैला खोए बिना 'java.io' का उपयोग कर सकते हैं। – Dylan

1

प्ले 2.6 से, पर्यावरण getExistingFile, getFile, resource और resourceAsStream तरीकों, उदाहरण के लिए है:

class Something @Inject (environment: play.api.Environment) { 
    // ... 
    environment.resourceAsStream("data.json") map (Json.parse(_)) 

(ध्यान दें, इस मामले data.jsonconf फ़ोल्डर के अंदर है में)

https://www.playframework.com/documentation/2.6.x/api/scala/index.html#play.api.Environment