如何使用Play json在json级别更改json字段值?

时间:2019-06-12 10:48:03

标签: scala playframework play-json

我有一个简单的案例类,可以在我的应用程序中使用它,有时将其更改为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))

我想知道是否有一种方法可以将json中的b更改为Int,如果我知道它总是一个int值(但不幸的是,在MyClass中它必须是字符串)?

因此,我将发送{"a": "1", "b": "2"}而不是{"a": "1", "b": 2}

我可以使用JsValue还是JsObject来做到这一点?我不想拥有另一个案例类并将其转换为另一个案例类。

1 个答案:

答案 0 :(得分:2)

使用自定义写入而不是默认的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。