Как изменить значение поля JSON на уровне JSON с помощью Play JSON? - PullRequest
0 голосов
/ 12 июня 2019

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

1 Ответ

2 голосов
/ 12 июня 2019

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

...