我有一个简单的案例类,可以在我的应用程序中使用它,有时将其更改为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来做到这一点?我不想拥有另一个案例类并将其转换为另一个案例类。
答案 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。