Pertimbangkan kelas kasus ini
case class Location(val name: String, val id: Option[Long] = None)
Saya bisa menulis "toJson" seperti ini:
implicit val locationWrites: Writes[Location] = (
(JsPath \ "name").write[String] and
(JsPath \ "id").write[Option[Long]]
) (unlift(Location.unapply))
tapi saya kesulitan dengan "fromJson":
implicit val locationReads: Reads[Location] = (
(JsPath \ "name").read[String]
) (Location.apply _, None)
Penjelasan: Id sebenarnya harus disetel oleh lapisan persistensi, jadi saya tidak ingin memberikannya secara manual.
Saya juga mencoba:
implicit val locationReads: Reads[Location] = (
(JsPath \ "name").read[String] and
(JsPath \ "id").read[Option[Long]]
) (Location.apply _)
tapi sayangnya kemudian saya mendapatkan:
Tidak ditemukan deserializer Json untuk tipe Option[Long]. Cobalah untuk menerapkan Bacaan atau Format implisit untuk jenis ini.
Apakah saya benar-benar perlu membuat implisit untuk itu juga?
Kenapa ini bisa berhasil (seperti dalam: kompilasi)? Saya bertanya karena itu sangat sepele bagi manusia, namun tiba-tiba ada yang tersirat dan terkompilasi. Meskipun aku tidak yakin apakah ini masuk akal, tapi aku khawatir tidak
implicit val optionalLongReads: Reads[Option[Long]] = (
(JsPath \ "optional").read[Option[Long]]
)
edit: jelas tidak masuk akal.
Jika saya mengirim curl --include --request POST --header "Content-type:application/json" --data '{"name": "Gondor", "id": "2"}' localhost:9000
saya mendapatkan:
HTTP/1.1 500 Kesalahan Server Internal
Panjang Konten: 8029
Tipe Konten: teks/html; charset=utf-8
Tanggal: Sabtu, 08 Okt 2016 21:49:51 GMT
Saya juga tidak bisa membiarkan id kosong :(