【发布时间】:2025-12-22 16:45:11
【问题描述】:
我有一个包含密码字段的案例类。为了安全起见,我需要在转换为 Json 时将其屏蔽。 所以我为此创建了一个自定义序列化程序,如下所示。
import org.json4s.CustomSerializer
import org.json4s._
import scala.runtime.ScalaRunTime
import org.json4s.jackson.JsonMethods._
case class UserInfo(
userid: Long,
username: Option[String],
password: Option[String]
) {
override def toString: String = {
val ui = this.copy(password = password.map(_ => "******"))
ScalaRunTime._toString(ui)
}
}
case object UserInfoSerializer extends CustomSerializer[UserInfo](format => ({
case jsonObj: JObject =>
implicit val formats = DefaultFormats
jsonObj.extract[UserInfo]
}, {
case ui: UserInfo =>
implicit val formats = DefaultFormats
Extraction.decompose(ui.copy(password = ui.password.map(_ => "******")))
}))
implicit val formats = DefaultFormats + UserInfoSerializer
但是当我尝试通过write(render(ui)) 将val ui = UserInfo(123, Some("anonymous"), Some("xxx")) 转换为Json 字符串时,它总是失败并显示
scala> render(ui)
<console>:22: error: type mismatch;
found : UserInfo
required: org.json4s.JValue
(which expands to) org.json4s.JsonAST.JValue
render(ui)
我必须将其用作render(Extraction.decompose(ui)),或者添加从UserInfo 到JValue 的隐式转换为implicit def userInfo2JValue(ui: UserInfn) = Extraction.decompose(ui)
使自定义序列化程序作为默认序列化程序工作的正确方法是什么?
【问题讨论】:
-
注意:Json4s 是 vulnerable under DoS/DoW attacks!