2016-12-12 1 views
1

これは起こらないはずですが、サードパーティAPIがJSONレスポンスを返すことを理解していますが、Double/FloatまたはStringと全く同じフィールドです。 「なぜ我々はこのような世界に住んでいる」の多くの内部の議論の後、私はそのような応答を解析する方法を見つけるのに苦労しています:これを実行するとJSONレスポンスからの数値OR文字列値の再生 - Scala - Play

implicit val inconsistentReads: Reads[InconsistentItem] = (
    (JsPath \ "field").readNullable[String] ... 
)(InconsistentItem.apply _) 

、私は「play.apiを取得しています。 libs.json.JsResultException:JsResultException "フィールドが数値として返されることがあります。

Jsonレスポンスで数値か文字列かにかかわらず、文字列として読み取ることは可能でしょうか?

これは、Play FrameworkのScala向けです。本当にありがとう!

答えて

4

このようなものを試してみてください。 InconsistentItemを定義していないので、Eitherを使用します。

val inconsistentReads = Reads[Either[String, BigDecimal]] { 
    case JsNumber(a) => JsSuccess(Right(a)) 
    case JsString(a) => JsSuccess(Left(a)) 
    case _ => JsError("Type not supported") 
    } 

例:

Json.parse("\"hi\"").validate[Either[String, BigDecimal]](inconsistentReads) 
# JsSuccess(Left("hi")) 
Json.parse("1").validate[Either[String, BigDecimal]](inconsistentReads) 
# JsSuccess(Right(1)) 
+1

のより一般的なdefintion読み込み[いずれか]:https://gist.github.com/graingert/7b1c9d20fb5f4cb081dd5a640ca335f4#file-jseither-scala – ulric260

関連する問題