为什么JsError转换为默认的JsSuccess?

问题描述 投票:1回答:1

我使用的播放JSON的2.6.3 WithDefaultValues如下

implicit def jsonFormatFoo = Json.using[Json.WithDefaultValues].format[Foo]

 implicit def jsonFormatBar = Json.using[Json.WithDefaultValues].format[Bar]

但是它给出了意外的行为:

case class Bar(name:String)
case class Foo(bars: List[Bars] = List.empty)

现在,如果我这样做

val result = Json.parse("""{"bars":[{"name":null}]}""").validate[Foo]

println(result)

我得到JsSuccess(Foo(List()),)。我期待JsError(List((/bars(0)/name,List(JsonValidationError(List(error.expected.jsstring),WrappedArray())))))一旦我删除默认List.empty只来了。

如果我有一个默认的,为什么JsError转换为默认值JsSuccess?其位不直观。我该如何解决呢?

json scala playframework play-json
1个回答
2
投票

有一些变化开始Play版本,JSON 2.6.8。如果您切换到它或更高的版本,那么就应该开始抱怨对吧null值:

libraryDependencies += "com.typesafe.play" %% "play-json" % "2.6.8"

@ import play.api.libs.json._
import play.api.libs.json._

@  case class Bar(name:String)
defined class Bar

@  case class Foo(bars: List[Bar] = List.empty)
defined class Foo

@ implicit def jsonFormatBar = Json.using[Json.WithDefaultValues].format[Bar]
defined function jsonFormatBar

@ implicit def jsonFormatFoo = Json.using[Json.WithDefaultValues].format[Foo]
defined function jsonFormatFoo

@ Json.parse("""{"bars":[{"name":null}]}""").validate[Foo]
res6: JsResult[Foo] = JsError(List((JsPath(List(KeyPathNode("bars"), IdxPathNode(0), KeyPathNode("name"))), List(JsonValidationError(List("error.expected.jsstring"), WrappedArray())))))
© www.soinside.com 2019 - 2024. All rights reserved.