如何使用 Play json 更改 json 关卡中的 json 字段值?

how to change json field value in the json level with Play json?

我有一个简单的案例 class,我在我的应用程序中使用它,有时我将其更改为 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 来实现吗?我不想有另一个案例 class 并将其转换为另一个案例 class..

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