scala.MatchError: null while conversion to JSON
scala.MatchError: null while conversion to JSON
我有一个基于 Play 的应用程序!框架。还有下一个类
package models
sealed trait Role
object Role {
case object Administrator extends Role
case object Accountant extends Role
case object Cashier extends Role
case object Repairman extends Role
implicit def Role2Int(role: Role): Int = {
role match {
case Administrator => 1
case Accountant => 2
case Cashier => 4
case Repairman => 8
case _ => throw new NotImplementedError(s"Conversion from $role to Int is not supported yet.")
}
}
implicit def Int2Role(i: Int): Role = {
i match {
case 1 => Administrator
case 2 => Accountant
case 4 => Cashier
case 8 => Repairman
case _ => throw new NotImplementedError(s"Not supported role value.")
}
}
}
case class User(
id: Long,
lastName: String,
firstName: String,
middleName: Option[String],
role: Role,
creationDate: Date,
editDate: Option[Date],
creatorId: Long,
editorId: Option[Long]
)
我需要的是将 User 类型的实例序列化为 JSON。要使用 standart play 的 json-serializer 来做到这一点,我必须实现一个编写器。
Btw: it's strange that one have to write so many lines of code to get
a result in such a simple case (the same for the reader). May be there
is better solution?
好了,作者写完了。但是当我尝试序列化时
import java.sql.Date
import models.Role.Accountant
import models._
import play.api.libs.json.{Writes, Json}
implicit val userWrites = new Writes[User] {
def writes(user: User) = Json.obj(
"id" -> user.id,
"lastName" -> user.lastName,
"firstName" -> user.firstName,
"middleName" -> user.middleName,
"role" -> Role.Role2Int(user.role),
"creationDate" -> user.creationDate,
"editDate" -> user.editDate,
"creatorId" -> user.creatorId,
"editorId" -> user.editorId
)
}
val user = User(1, "Smith", "John", null, Accountant, new Date(System.nanoTime()), null, 0, null)
Json.toJson(user)
我明白了
scala.MatchError: null
at play.api.libs.json.DefaultWrites$$anon.writes(app.sc2.tmp:180)
at play.api.libs.json.DefaultWrites$$anon.writes(app.sc2.tmp:178)
at play.api.libs.json.Json$.toJsFieldJsValueWrapper(app.sc2.tmp:139)
at #worksheet#.$anon.writes(app.sc2.tmp:12)
at #worksheet#.$anon.writes(app.sc2.tmp:7)
at play.api.libs.json.Json$.toJson(app.sc2.tmp:104)
at #worksheet#.get$$instance$$res1(app.sc2.tmp:25)
at #worksheet#.#worksheet#(app.sc2.tmp:49)
我做错了什么?
行:
val user = User(1, "Smith", "John", null, Accountant, new Date(System.nanoTime()), null, 0, null)
应该是:
val user = User(1, "Smith", "John", None, Accountant, new Date(System.nanoTime()), None, 0, None)
如上评论所述,将null改为None。
我有一个基于 Play 的应用程序!框架。还有下一个类
package models
sealed trait Role
object Role {
case object Administrator extends Role
case object Accountant extends Role
case object Cashier extends Role
case object Repairman extends Role
implicit def Role2Int(role: Role): Int = {
role match {
case Administrator => 1
case Accountant => 2
case Cashier => 4
case Repairman => 8
case _ => throw new NotImplementedError(s"Conversion from $role to Int is not supported yet.")
}
}
implicit def Int2Role(i: Int): Role = {
i match {
case 1 => Administrator
case 2 => Accountant
case 4 => Cashier
case 8 => Repairman
case _ => throw new NotImplementedError(s"Not supported role value.")
}
}
}
case class User(
id: Long,
lastName: String,
firstName: String,
middleName: Option[String],
role: Role,
creationDate: Date,
editDate: Option[Date],
creatorId: Long,
editorId: Option[Long]
)
我需要的是将 User 类型的实例序列化为 JSON。要使用 standart play 的 json-serializer 来做到这一点,我必须实现一个编写器。
Btw: it's strange that one have to write so many lines of code to get a result in such a simple case (the same for the reader). May be there is better solution?
好了,作者写完了。但是当我尝试序列化时
import java.sql.Date
import models.Role.Accountant
import models._
import play.api.libs.json.{Writes, Json}
implicit val userWrites = new Writes[User] {
def writes(user: User) = Json.obj(
"id" -> user.id,
"lastName" -> user.lastName,
"firstName" -> user.firstName,
"middleName" -> user.middleName,
"role" -> Role.Role2Int(user.role),
"creationDate" -> user.creationDate,
"editDate" -> user.editDate,
"creatorId" -> user.creatorId,
"editorId" -> user.editorId
)
}
val user = User(1, "Smith", "John", null, Accountant, new Date(System.nanoTime()), null, 0, null)
Json.toJson(user)
我明白了
scala.MatchError: null
at play.api.libs.json.DefaultWrites$$anon.writes(app.sc2.tmp:180)
at play.api.libs.json.DefaultWrites$$anon.writes(app.sc2.tmp:178)
at play.api.libs.json.Json$.toJsFieldJsValueWrapper(app.sc2.tmp:139)
at #worksheet#.$anon.writes(app.sc2.tmp:12)
at #worksheet#.$anon.writes(app.sc2.tmp:7)
at play.api.libs.json.Json$.toJson(app.sc2.tmp:104)
at #worksheet#.get$$instance$$res1(app.sc2.tmp:25)
at #worksheet#.#worksheet#(app.sc2.tmp:49)
我做错了什么?
行:
val user = User(1, "Smith", "John", null, Accountant, new Date(System.nanoTime()), null, 0, null)
应该是:
val user = User(1, "Smith", "John", None, Accountant, new Date(System.nanoTime()), None, 0, None)
如上评论所述,将null改为None。