如何使用 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。
我有一个简单的案例 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。