2016-12-12 66 views
1

我明白這不應該發生,但是第三方API正在返回JSON響應,具有與Double/Float完全相同的字段或作爲字符串。的「爲什麼我們生活在這樣一個世界」,我在努力尋找一種方法來分析這種反應的內部爭論後:從Json響應解析數字或字符串值 - Scala - 播放

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

的更通用的確定指標讀取[要麼]:https://gist.github.com/graingert/7b1c9d20fb5f4cb081dd5a640ca335f4#file-jseither-scala – ulric260