/ / Produire du json dans une application Scala avec json4s - json, scala, scalatra, json4s

Produire du json dans une application Scala utilisant json4s - json, scala, scalatra, json4s

J'essaie de produire du JSON dans une application Scala à l'aide de json4. Assez simple, voici quelques exemples de valeur que j’ai rassemblés pour le tester dans mon application Scalatra:

import org.json4s._
import org.json4s.JsonDSL._


object JsonStub {
val getPeople =
("people" ->
("person_id" -> 5) ~
("test_count" -> 5))

}

Dans mon contrôleur, j'ai simplement:

import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.{DefaultFormats, Formats}

class FooController(mongoDb: MongoClient)(implicit val swagger: Swagger) extends ApiStack with NativeJsonSupport with SwaggerSupport {

get ("/people", operation(getPeople)) {
JsonStub.getPeople
}

}

La sortie que je vois dans le navigateur est cependant la suivante:

{
"_1": "people",
"_2": {
"person_id": 5,
"test_count": 5
}
}

Aucun indice où le _1 et _2 les clés viennent? Je m'attendais plutôt à cette sortie:

{
"people":{
"person_id": 5,
"test_count": 5
}
}

Réponses:

5 pour la réponse № 1

Ce que vous voyez dans la sortie est un tuple réfléchissant en série, qui a des champs _1 et _2. C’est parce que le type de retour que le compilateur a déduit pour JsonStub.getPeople est Tuple2[String, JObject].

Le json4s DSL utilise des conversions implicites pour transformer des valeurs telles que le tuple en un JValue. Mais, si vous ne dites pas au compilateur que vous voulez un JValue, il n’appliquera pas la conversion.

Idéalement, cela entraînerait une erreur de compilation,parce que vous avez essayé de produire du JSON à partir de quelque chose qui n'est pas le bon type. Malheureusement, parce que votre infrastructure Web suppose que vous souhaitez revenir à la sérialisation basée sur la réflexion, cela signifie qu'il existe un autre moyen de transformer le tuple en JSON, ce qui n'est pas ". Ce que tu voulais

Si vous dites explicitement au compilateur que vous voulez un JValue et pas un Tuple2, la conversion implicite du DSL sera appliquée au bon endroit.

val getPeople: JValue =
("people" ->
("person_id" -> 5) ~
("test_count" -> 5))