web-dev-qa-db-ja.com

Play with Scalaを使用してJSONファイルをロードする方法

controllersに都市のリストを含むJSONファイルをロードして、viewその後。

ここにファイルを配置しました:app/assets/jsons/countriesToCities.json
(ところで:これは適切な場所ですか、それとも別の場所に置くべきですか?)

私はdocsを読みました。文字列からJsValueを作成できることがわかります: https:/ /www.playframework.com/documentation/2.4.x/ScalaJson#Using-string-parsing

同様の方法でJsValueを作成したいと思います。違いは、文字列ではなく、ファイルからコンテンツをロードすることです...方法に関するコードスニペットが見つかりませんでした残念ながらこれを行います。
他の何かを使用してファイルを文字列に読み込み、その文字列に対して解析メソッドを使用する必要がありますか?

回答にこれを行う方法の例を含むコードスニペットを高く評価します! :)

事前にどうもありがとうございました!

19

ここに私がどうやってそれを解決したかがあります:

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

助けてくれてありがとう! :)

12

重複の可能性についてのコメントは、app/assetsフォルダーからファイルを読み取る方法です。私の答えは、ストリームからJsonを解析する方法についてです。 2つを組み合わせると、うまくいくはずです。

Json.parse は、いくつかの異なる引数タイプを受け入れます。そのうちの1つはInputStreamです。

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

追伸書かれたドキュメントで探しているものが見つからない場合は、 API Docs から始めるのが良いでしょう。

18
Dylan

Play 2.6から、EnvironmentにはgetExistingFilegetFileresourceおよび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

4
flurdy

通常、いくつかの単純な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)
0
mkarmona