2016-03-07 41 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,我可以更新代碼。