Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化模型时播放Json-冲突_Json_Scala_Playframework 2.0 - Fatal编程技术网

反序列化模型时播放Json-冲突

反序列化模型时播放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中case类的序列化/反序列化。我正在使用
播放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
函数中的匹配顺序,但更改匹配顺序会产生另一个冲突。因此,如果有人以前遇到过此问题,他能否为我提供一个解决方法或更好的解决方案