Опитвам се да създам JSON в приложение Scala, използвайки json4s. Доста направо напред, Ето една примерна стойност, която събрах, за да я тествам в моето приложение Scalatra:
import org.json4s._
import org.json4s.JsonDSL._
object JsonStub {
val getPeople =
("people" ->
("person_id" -> 5) ~
("test_count" -> 5))
}
В моя контролер просто имам:
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
}
}
Резултатът, който виждам в браузъра обаче, е следният:
{
"_1": "people",
"_2": {
"person_id": 5,
"test_count": 5
}
}
Всяка улика _1
и _2
идват ключове? Очаквах вместо това този резултат:
{
"people":{
"person_id": 5,
"test_count": 5
}
}
Отговори:
5 за отговор № 1Това, което виждате в изхода, е отразяващо сериализиран кортеж, който има полета _1
и _2
, Това е така, защото типът връщане, за който компилаторът е направил заключение JsonStub.getPeople
е Tuple2[String, JObject]
.
DSL json4s използва неявни преобразувания, за да превърне стойности като кортеж в a JValue
, Но ако не кажете на компилатора, че сте искали JValue
, няма да приложим преобразуването.
В идеалния случай това би довело до грешка при компилиране,защото се опитахте да произведете JSON от нещо, което не е правилния тип. За съжаление, тъй като вашата уеб рамка предполага, че искате да се върнете към сериализация, базирана на размисъл, това означава, че има друг начин да превърнете кортежа в JSON, което не е " t това, което си искал.
Ако изрично кажете на компилатора, че искате a JValue
и не Tuple2
, неявното преобразуване на DSL ще бъде приложено на правилното място.
val getPeople: JValue =
("people" ->
("person_id" -> 5) ~
("test_count" -> 5))