【问题标题】:how to change json field value in the json level with Play json?如何使用 Play json 更改 json 级别中的 json 字段值?
【发布时间】:2019-10-26 20:36:38
【问题描述】:

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

【问题讨论】:

  • 你自己已经尝试过什么?代码?
  • 我创建了一个新的案例类 MyClassFix(a: String, b: Int) 然后对其进行转换,但我的真实案例类很大,所以我不想要它
  • 为什么那是String 如果(至少在某些情况下)那是Int ...我会说一开始存在设计问题

标签: scala playframework play-json


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2018-11-07
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多