web-dev-qa-db-fra.com

Comment charger un fichier JSON en utilisant Play avec Scala

J'ai besoin de charger un fichier JSON avec une liste de villes dans l'un de mes contrôleurs , afin de le passer à un voir ensuite.

J'ai placé le fichier ici: app/assets/jsons/countriesToCities.json
(Soit dit en passant: est-ce un endroit approprié, ou devrais-je le placer ailleurs?)

J'ai lu les documents et je peux voir qu'il est possible de créer un JsValue à partir d'une chaîne: https://www.playframework.com/documentation/2.4.x/ScalaJson#Using-string-parsing

Je veux créer un JsValue d'une manière similaire. La différence est que je veux charger le contenu à partir d'un fichier , pas à partir d'une chaîne ... Je n'ai trouvé aucun extrait de code sur la façon de faites cela, malheureusement.
Dois-je utiliser autre chose pour lire le fichier dans une chaîne et ensuite seulement utiliser la méthode d'analyse sur cette chaîne?

Des extraits de code avec des exemples sur la façon de procéder dans les réponses seront très appréciés! :)

Merci beaucoup d'avance!

19
Henrique Ferrolho

Voici comment j'ai réussi à le résoudre:

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

Merci pour l'aide! :)

12
Henrique Ferrolho

On dirait que le commentaire sur le doublon possible est de savoir comment lire un fichier à partir de votre dossier app/assets. Ma réponse est de savoir comment analyser Json à partir d'un flux. Combinez les deux et vous devriez être prêt à partir.

Json.parse accepte quelques types d'arguments différents, dont InputStream.

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

P.S. Lorsque vous ne trouvez pas ce que vous cherchez dans les documents écrits, les API Docs sont un bon point de départ.

18
Dylan

Depuis Play 2.6, l'environnement a les méthodes getExistingFile, getFile, resource et resourceAsStream, par exemple:

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

(Remarque, dans ce cas data.json se trouve dans le dossier conf )

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

4
flurdy

J'ai généralement besoin de quelques petits dictionnaires pour vivre en mémoire afin de construire des LUT simples (tables de recherche). Pour ce faire, j'utilise le code suivant (veuillez noter que j'utilise la dernière version Play 2.6 ):

def loadJSONFromFilename(filename: String): Option[JsValue] =
  Option(Source.fromFile(filename).mkString)
    .map(Json.parse)

L'utilisation de la fonction précédente consiste simplement à passer un chemin filename. Personnalisant ceci pour être utilisé avec Play, vous devrez peut-être placer votre fichier dans un dossier de ressources et pour l'activer, vous devrez le placer dans votre build.sbt fichier:

// include resources into the unversal zipped package using sbt dist
mappings in Universal ++= directory(baseDirectory.value / "resources")

Ainsi, vous pouvez utiliser ce dossier de ressources de cette façon dans votre classe Play:

lazy val lutFilePath: Path = 
  Paths.get(env.rootPath.getAbsolutePath, "resources", "lut.json")
lazy val lutJson = loadJSONFromFilename(lutFilePath.toString)
0
mkarmona