controllersに都市のリストを含むJSON
ファイルをロードして、viewその後。
ここにファイルを配置しました:app/assets/jsons/countriesToCities.json
(ところで:これは適切な場所ですか、それとも別の場所に置くべきですか?)
私はdocsを読みました。文字列からJsValue
を作成できることがわかります: https:/ /www.playframework.com/documentation/2.4.x/ScalaJson#Using-string-parsing
同様の方法でJsValue
を作成したいと思います。違いは、文字列ではなく、ファイルからコンテンツをロードすることです...方法に関するコードスニペットが見つかりませんでした残念ながらこれを行います。
他の何かを使用してファイルを文字列に読み込み、その文字列に対して解析メソッドを使用する必要がありますか?
回答にこれを行う方法の例を含むコードスニペットを高く評価します! :)
事前にどうもありがとうございました!
ここに私がどうやってそれを解決したかがあります:
val source: String = Source.fromFile("app/assets/jsons/countriesToCities.json").getLines.mkString
val json: JsValue = Json.parse(source)
助けてくれてありがとう! :)
重複の可能性についてのコメントは、app/assetsフォルダーからファイルを読み取る方法です。私の答えは、ストリームからJsonを解析する方法についてです。 2つを組み合わせると、うまくいくはずです。
Json.parse
は、いくつかの異なる引数タイプを受け入れます。そのうちの1つはInputStream
です。
val stream = new FileInputStream(file)
val json = try { Json.parse(stream) } finally { stream.close() }
追伸書かれたドキュメントで探しているものが見つからない場合は、 API Docs から始めるのが良いでしょう。
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(ルックアップテーブル)を構築するために、メモリに格納する小さな辞書はほとんど必要ありません。それを実現するために、次のコードを使用します(最新の 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)