/ / Създаване на json в приложение Scala, използващо json4s - json, scala, scalatra, json4s

Произвеждането на json в приложение Scala чрез json4s - json, scala, scalatra, json4s

Опитвам се да създам 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))