反序列化模型时播放Json-冲突
我在单元测试中遇到了一个奇怪的问题,关于JSON中case类的序列化/反序列化。我正在使用反序列化模型时播放Json-冲突,json,scala,playframework-2.0,Json,Scala,Playframework 2.0,我在单元测试中遇到了一个奇怪的问题,关于JSON中case类的序列化/反序列化。我正在使用播放json(2.5.10)并为我的事件定义了一个模型: case class BFFEvent ( startTime: Long, endTime: Long, eventType: BFFEventType.Value, // just an enum payload: Option[Payload] ) object BFFEvent { im
播放json(2.5.10)
并为我的事件定义了一个模型:
case class BFFEvent
(
startTime: Long,
endTime: Long,
eventType: BFFEventType.Value, // just an enum
payload: Option[Payload]
)
object BFFEvent {
implicit val BFFEventFormat = Json.format[BFFEvent]
}
Payload
是一个具有许多子类型的ADT,但我只列出了冲突的案例类:
sealed trait Payload
case class UserFlag
(
flag: Option[BFFEventFlag],
freeText: Option[String],
source: Option[BFFEventSource],
timestamp : Option[Timestamp]
) extends Payload
case class CommunicationMode(mode: Int) extends Payload
implicit val payloadReads = {
val userFlag = Json.reads[UserFlag]
val communicationMode = Json.reads[CommunicationMode]
__.read[UserFlag](userFlag).map(x => x: Payload) |
__.read[CommunicationMode](communicationMode).map(x => x: Payload)
}
implicit val payloadWrites = Writes[Payload] {
case userFlag: UserFlag => Json.writes[UserFlag].writes(userFlag)
case communicationMode: CommunicationMode => Json.writes[CommunicationMode].writes(communicationMode)
}
在单元测试中,我检查是否可以读取/写入有效负载模型的JSON:
val communicationMode = BFFEvent(0, 0, BFFEventType.COMMUNICATIONMODE, Some(CommunicationMode(0)))
it should "serialize and deserialize a CommunicationMode" in {
val validatedJSON = Json.toJson(communicationMode).validate[BFFEvent]
validatedJSON should be(JsSuccess(communicationMode))
}
测试输出:
BFFEvent(0,0,COMMUNICATIONMODE,Some(CommunicationMode(0)))
JsSuccess(BFFEvent(0,0,COMMUNICATIONMODE,Some(UserFlag(None,None,None,None))),)
JsSuccess(BFFEvent(0,0,COMMUNICATIONMODE,Some(UserFlag(None,None,None,None))),) was not equal to JsSuccess(BFFEvent(0,0,COMMUNICATIONMODE,Some(CommunicationMode(0))),)
ScalaTestFailureLocation: com.bioserenity.bff.test.TEST_BFF_MODELS_SERIALIAZER$$anonfun$1 at (TEST_BFF_MODELS_SERIALIAZER.scala:81)
Expected :JsSuccess(BFFEvent(0,0,COMMUNICATIONMODE,Some(CommunicationMode(0))),)
Actual :JsSuccess(BFFEvent(0,0,COMMUNICATIONMODE,Some(UserFlag(None,None,None,None))),)
虽然json转换的输入是带有CommunicationMode
负载的bfevent
,但它被翻译成UserFlag
。我认为问题来自于payloadReads
函数中的匹配顺序,但更改匹配顺序会产生另一个冲突。因此,如果有人以前遇到过此问题,他能否为我提供一个解决方法或更好的解决方案