如果某些字段不存在,则播放 Json 框架无法解析 json 字符串



我定义了一个案例类 Fruit:

case class Fruit(name: String, weight: Double)

我写了一个拯救水果的动作

def saveFruit = Action(parse.json) { request: Request[JsValue] =>
import models.Implicits._
val json = request.body
val fruitResult = Json.fromJson[Fruit](json)
if (fruitResult.isSuccess) {
val fruit = fruitResult.get
println(fruit)
Ok(JsString("1"))
} else {
Ok(JsString("2"))
}
}

如果请求正文{ "name":"ABC","weight":10},则将成功调用该操作。

如果请求体{ "name":"ABC"},则发生错误,抱怨对象上没有未定义weight

{ "name":"ABC"}是一个有效的 json 字符串,无法解析为 水果,权重将为空

我不确定如何解决此问题。

我正在使用播放 2.6.0

我强烈建议不要在任何地方允许null的兔子洞。如果您开始在请求对象中允许这样做,您将永远不知道模型中的任何地方是否存在 null。

解决此问题的典型方法是按照评论中的建议将其设置为Option

如果您正在处理更复杂的解决方案,则为客户端可能不会发送值的值创建具有大量Option的专用请求对象可能是有意义的。然后,您将在控制器中将请求对象映射/转换到域模型中,并相应地验证输入。

例如:

case class FruitRQ(name: String, weight: Option[Double])
case class Fuit(name: String, weight: Double)
class MyController {
def myAction = {
val fruitRq = Json.fromJson[FruiteRQ](request.body)
(for (weight <- fruitRq.weight) yield {
val fruit = Fruit(fruitRq.name, weight)
// do something with the validate fruit
}).getOrElse {
// return 4xx to client saying that a field is missing
}
}
}

最新更新