2016-03-07 89 views
1
case class HydraQueueMessage(tableType: HydraTableName.Value, payload: String) 


object MedusaElementFormat extends DefaultJsonProtocol { 
    implicit object HydraElementFormat extends RootJsonFormat[HydraQueueMessage] { 
    def write(message: HydraQueueMessage) = JsObject(
     MedusaEnum.HydraTableName.toString -> JsString(message.tableType.toString), 
     "payload" -> JsString(message.payload) 
    ) 
    def read(value: JsValue) = { 
     value.asJsObject.getFields("tableType", "payload") match { 
     case Seq(JsString(tableType), JsString(payload)) => 
      new HydraQueueMessage(tableType = tableType, payload = payload) 
     } 
    } 
    } 
} 

在这个例子中有一个类型错过匹配,是否有一个更清晰的方式来实现这一点?并且仍然将tableType作为Value而不是String?自定义喷雾JSON编组与案例类价值类型

我的编组器会抛出一个与值类型不匹配的类型,我也无法编写JsValue。那么,如何在不使用字符串类型tableType的情况下编码HydraQueueMessage案例类?

回答

3

您正试图一次处理太多。我想将您的问题以2:

  1. 过程HydraTableName.Value
  2. 过程HydraQueueMessage

这将使事情变得更加简单。

为了处理您的枚举:

implicit object StepFormatJsonFormat extends RootJsonFormat[HydraTableName.Value] { 
    def write(obj: HydraTableName.Value): JsValue = JsString(obj.toString) 

    def read(jsonValue: JsValue): HydraTableName.Value = jsonValue match { 
    case JsString(stringObj) => HydraTableName.withName(stringObj) 
    case otherValue => throw new DeserializationException(s"HydraTableName.Value not found in ${otherValue.toString}") 
    } 
} 

然后典型案例类格式:

implicit val HydraQueueMessageFormat = jsonFormat2(HydraQueueMessage.apply) 

也许来处理枚举应适应方式。 如果您包含HydraTableName,我可以更新代码。