Как изменить значение поля json на уровне json с помощью Play json?

У меня есть простой класс 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.


127
1

Ответ:

Решено

Используйте пользовательские записи, а не значения по умолчанию 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.