簡體   English   中英

如何使用Play with Scala加載JSON文件

[英]How to load JSON file using Play with Scala

我需要在我的一個控制器中加載一個帶有城市列表的JSON文件,以便之后將其傳遞給視圖

我把文件放在這里: app/assets/jsons/countriesToCities.json
(順便說一下:這是一個合適的位置,還是應該把它放在其他地方?)

我已經閱讀了文檔 ,我可以看到可以從字符串創建一個JsValuehttpsJsValue

我想以類似的方式創建一個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有getExistingFilegetFileresourceresourceAsStream方法,例如:

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

我通常需要很少的小字典才能在內存中生成一些簡單的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM