[英]How to load JSON file using Play with Scala
我需要在我的一個控制器中加載一個帶有城市列表的JSON
文件,以便之后將其傳遞給視圖 。
我把文件放在這里: app/assets/jsons/countriesToCities.json
(順便說一下:這是一個合適的位置,還是應該把它放在其他地方?)
我已經閱讀了文檔 ,我可以看到可以從字符串創建一個JsValue
: https : JsValue
我想以類似的方式創建一個JsValue
。 不同之處在於我想從文件加載內容,而不是從字符串加載......遺憾的是,我還沒有找到任何關於如何執行此操作的代碼段。
我是否必須使用其他東西將文件讀入字符串,然后才對該字符串使用parse方法?
我們將非常感謝代碼片段以及如何在答案中執行此操作的示例! :)
非常感謝你提前!
看起來關於可能重復的評論是如何從app / assets文件夾中讀取文件。 我的答案是關於如何從流中解析Json。 結合這兩個,你應該很高興去。
Json.parse
接受一些不同的參數類型,其中一個是InputStream
。
val stream = new FileInputStream(file)
val json = try { Json.parse(stream) } finally { stream.close() }
PS如果您無法在書面文檔中找到所需內容,那么API文檔就是一個很好的起點。
以下是我設法解決的方法:
val source: String = Source.fromFile("app/assets/jsons/countriesToCities.json").getLines.mkString
val json: JsValue = Json.parse(source)
謝謝您的幫助! :)
從Play 2.6開始,Environment有getExistingFile
, getFile
, resource
和resourceAsStream
方法,例如:
class Something @Inject (environment: play.api.Environment) {
// ...
environment.resourceAsStream("data.json") map ( Json.parse(_) )
(注意,在這種情況下data.json在conf文件夾中)
https://www.playframework.com/documentation/2.6.x/api/scala/index.html#play.api.Environment
我通常需要很少的小字典才能在內存中生成一些簡單的LUT(LookUp Tables)。 為了實現這一點,我使用下面的代碼(請注意我使用的是最新的Play 2.6 ):
def loadJSONFromFilename(filename: String): Option[JsValue] =
Option(Source.fromFile(filename).mkString)
.map(Json.parse)
使用前一個函數只需傳遞filename
路徑。 調整這個以與Play一起使用,您可能需要將文件放在資源文件夾中並啟用它,您需要將它放在build.sbt
文件中:
// include resources into the unversal zipped package using sbt dist
mappings in Universal ++= directory(baseDirectory.value / "resources")
因此,您可以在Play類中以這種方式使用此資源文件夾:
lazy val lutFilePath: Path =
Paths.get(env.rootPath.getAbsolutePath, "resources", "lut.json")
lazy val lutJson = loadJSONFromFilename(lutFilePath.toString)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.