почему JsError по умолчанию конвертируется в JsSuccess? - PullRequest
0 голосов
/ 04 февраля 2019

Я использую Play-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 значения по умолчанию?Это немного не интуитивно понятно.Как мне решить это?

1 Ответ

0 голосов
/ 04 февраля 2019

Есть некоторые изменения, начиная с версии 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())))))
...