У меня есть простой класс case, с которым я работаю в своем приложении, и в какой-то момент я меняю его на json и отправляю на какой-то вызов API, например так:
import play.api.libs.json.{Json, OFormat}
object MyClassSer {
implicit val MyClassFormat: OFormat[MyClass] = Json.format[MyClass]
}
import MyClassSer._
case class MyClass(a: String, b: String)
val myClass = MyClass("1", "2")
myApiService.post(Json.toJson(myClass))
Интересно, есть ли способ изменить b
в json на Int, если я знаю, что это всегда будет значение int (но, к сожалению, в MyClass это должна быть строка)?
поэтому вместо {"a": "1", "b": "2"}
я отправлю {"a": "1", "b": 2}
я могу сделать это как-то с JsValue или JsObject? Я не хочу иметь другой класс case и преобразовывать его в другой класс case.
Используйте пользовательские записи, а не значения по умолчанию Json.format.....
:
import play.api.libs.json.{Json, _}
object MyClass {
implicit val format: OFormat[MyClass] = Json.format[MyClass]
implicit val customwrites: Writes[MyClass] = new Writes[MyClass] {
def writes(myClass: MyClass): JsValue = Json.obj(
"a" -> myClass.a,
"b" -> myClass.b.toInt
)
}
}
case class MyClass(a: String, b: String)
val myClass = MyClass("1", "2")
// use default writes implicitly
println(Json.toJson(myClass)) // {"a":"1","b":"2"}
// use non-default writes explicitly
println(Json.toJson(myClass)(MyClass.customwrites)) // {"a":"1","b":2}
Хотя я был бы осторожен с преобразованием типов, как вы хотите, без какого-либо запасного варианта, на тот случай, если значение не является Int.