動機
会社のとあるシステムでjsonに一項目増やしたらエラーが出るようになったので、jsonのparseが厳密すぎるのではないか?という話になったが、そんな馬鹿なという感じなのでちょっと試してみた。
ソースコード
Application.scala
package controllers
import play.api.libs.json.{Json, Reads}
import play.api.mvc._
class Application extends Controller {
def index = Action {
Ok(views.html.index("Your new application is ready."))
}
case class Person(name: String, age: Int)
implicit val personReads: Reads[Person] = Json.reads[Person]
def json = Action(parse.json) { implicit request =>
request.body.validate[Person].fold(invalid => BadRequest(invalid.mkString(",")), valid => Ok("no problem"))
}
}
Personクラスに則った形
Personクラスに則っていない形
うーむ
余裕でparseしよるので、原因は他にありそうですね。
結論
実はJacksonを使用していて、Jacksonのデシリアライズでエラーを出していた
http://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c#2-7
解決方法
case classに
@JsonIgnoreProperties(ignoreUnknown = true)
をつけてエラーを出さないようにしました。
Jacksonを使うときには気をつけないとダメですね。
playframeworkのjsonパースで厳密にparseするには
この辺かな?