2016-09-21 34 views
0

你如何使用RootJsonFormat與泛型?通用JSON支持

我必須複製粘貼每一種可能性是這樣的:

trait IDJsonSupport 
    extends SprayJsonSupport 
    with DefaultJsonProtocol{ 

    implicit object AddressIDFormat extends RootJsonFormat[ID[Address]] { 
    override def write(obj: ID[Address]): JsValue = JsNumber(obj.value) 
    override def read(json: JsValue): ID[Address] = json match { 
     case JsNumber(id) => new ID[Address](id.toLongExact) 
     case _ => deserializationError("Address ID expected") 
    } 
    } 

    implicit object CompanyIDFormat extends RootJsonFormat[ID[Company]] { 
    override def write(obj: ID[Company]): JsValue = JsNumber(obj.value) 
    override def read(json: JsValue): ID[Company] = json match { 
     case JsNumber(id) => new ID[Company](id.toLongExact) 
     case _ => deserializationError("Company ID expected") 
    } 
    } 

    implicit object NoteIDFormat extends RootJsonFormat[ID[Note]] { 
    override def write(obj: ID[Note]): JsValue = JsNumber(obj.value) 
    override def read(json: JsValue): ID[Note] = json match { 
     case JsNumber(id) => new ID[Note](id.toLongExact) 
     case _ => deserializationError("Note ID expected") 
    } 
    } 

    ... 

此:

implicit object AnyIDFormat extends RootJsonFormat[ID[_]] { ... } 

不起作用。

回答

0

首先,我認爲ID類是這樣定義的:

case class ID[T](value: Long) 

如果是這樣,你可以定義一個通用的格式implicit def和具體格式將Scala編譯器自動創建。

implicit def genericIDFormat[T]: RootJsonFormat[ID[T]] = new RootJsonFormat[ID[T]] { 
    override def write(obj: ID[T]): JsValue = JsNumber(obj.value) 
    override def read(json: JsValue): ID[T] = json match { 
    case JsNumber(id) => ID(id.toLongExact) 
    case _ => deserializationError("ID expected") 
    } 
} 
+0

謝謝。我不得不添加TypeTag,它的工作原理! – Etam