Play- JSON не предоставляет конфигурацию для каждого поля для кодеков на основе макросов, а vpid
не определено с указанным типом c (есть другие дополнительные String
в том же SectionProduct
).
С указанным типом c это может быть легко (и может иметь другие преимущества, кроме этого использования c с улучшенным набором текста).
import play.api.libs.json._
final class Vpid(val value: String) extends AnyVal
object Vpid {
import scala.language.implicitConversions
@deprecated("Use .value explicitly", "")
/*
* {{{
* val compatStr: String = new Vpid("foo")
* // => compatStr: String = foo
* }}}
*/
implicit def toString(id: Vpid): String = id.value
implicit def reads: Reads[Vpid] = Json.valueReads[Vpid].orElse(
implicitly[Reads[Int]].map { i => new Vpid(i.toString) })
}
case class SectionProduct(
vpid: Option[Vpid],
name: Option[String],
quantity: Option[Int])
implicit val reads: Reads[SectionProduct] = Json.reads
В каком случае:
val input1 = Json.parse("""{
"vpid": "foo",
"name": "bar"
}""")
input1.validate[SectionProduct]
// => JsSuccess(SectionProduct(Some(Vpid@18cc6),Some(bar),None),)
val input2 = Json.parse("""{
"vpid": 1,
"name": "bar"
}""")
input2.validate[SectionProduct]
// => JsSuccess(SectionProduct(Some(Vpid@31),Some(bar),None),)