我正在使用 Argonaut 解析 JSON 字符串。有一个要求:如果任何字段未提供,或者为空或空白,则将其改为字符串“未提供”。
我有一个解决方案,但似乎很复杂:
case class User(name: String, home: String)
implicit def UserDecodeJson: DecodeJson[User] = DecodeJson(j => for {
name <- (j --\ "name").as[BlankAsNonSupplied]
home <- (j --\ "home").as[BlankAsNonSupplied]
} yield User(name.value, home.value))
case class BlankAsNonSupplied(value: String)
implicit def BlankAsNonSuppliedDecodeJson: DecodeJson[BlankAsNonSupplied] = DecodeJson.withReattempt(a => {
val v = a.success.map(_.focus).flatMap(_.string)
.filterNot(_.trim.isEmpty)
.map(BlankAsNonSupplied.apply).getOrElse(BlankAsNonSupplied("not supplied"))
DecodeResult.ok(v)
})
你可以看到BlankAsNonSuppliedDecodeJson
一个非常复杂,很难理解。有没有办法让它(或整个例子)更简单?