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 № 1Ce 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))