2017-06-22 3 views
1

私は次のクラスScalaは、ネストされたオプションのプロパティ

case class User(id: String, imageId: Option[String]) 

私はこのようなルックスを持っているJSONのための読み込み、書き込みしようとしていると、オブジェクトを読み込みます存在しないか、またはnullである可能性があります。 私はこのようになります読み:

implicit val userReader: Reads[User] = (
(JsPath \ "id").read[String] and 
(JsPath \ "image" \ "id").readNullable[String] 
) (User.apply _) 

をしかし、これは動作するようには思えない、それが無い画像でサンプルを見つけたとき、私はまだエラーを取得します。 'ValidationError [...] error.path.missing [...]/image/id'

どうすれば解決できますか? Imageクラスを作成しないことをお勧めします。これはどこにも使用しません。

答えて

2

私は、問題はあなたがStringIntあるid一方を読み取ろうとしているという事実から来ていると思います。あなたはあなたのjson/readerであなたのタイプに気を付けるべきです。

つのオプション

  • idが本当にIntであれば、idStringある場合Int
  • としてそれを読んで、あなたはまだStringを持つようにしたい場合は、あなたのJSON

を変更あなたのケースクラスでは、あなたが行うことができます:

(JsPath \ "image" \ "id").readNullable[Int].map(_.toString) 
+0

これは明らかに問題ですが、私は画像がない例があるので、型の不一致を見ることができませんでした。 私はそれをStringに切り替えましたが、私はまだ同じエラーが発生します。 – Dragos

+0

同じことがルートの 'id'に適用されます –

0

2つの要素("id""image")の間にカンマを忘れてしまった。だからこそ、/image/idのパスがパーサーにとって欠けているようです。

JSON構造を検証するためのさまざまなツールがあります(例:https://jsonlint.com/)。 だからあなたのJSONの構造は次のようになります。

{ 
    "id": 1, 
    "image": { 
     "id": 2 
    } 
} 
0

を私が遅れる場合がありますが、ここでは、回避策です:

implicit val userReader: Reads[User] = (
    (JsPath \ "id").read[String] and 
    (JsPath \ "image" \ "id").readNullable[String].orElse((__ \ "dummy").readNullable[String]) 
) (User.apply _) 

ない完璧なしかし、それはよりよい解決策は、直接になり

うまく

を働きますoreslse内にJ Reads(JsSuccess(None:Option[Int]))をキャストしますが、私はそれを行うことができませんでした...

関連する問題