2017-07-03 115 views
0
case class Box(id: String, container: Container) 
    case class Container(id: String, boxes: List[Box]) 

    object CustomProtocol extends DefaultJsonProtocol { 
    implicit object BoxFormat extends RootJsonFormat[Box] { 
     override def read(json: JsValue): Box = json.asJsObject.getFields("id", "container") match { 
     case Seq(JsString(id), container) => Box(id, container.convertTo[Container]) 
     } 
     override def write(obj: Box): JsValue = ??? 
    } 
    implicit object ContainerFormar extends RootJsonFormat[Container] { 
     override def read(json: JsValue): Container = json.asJsObject.getFields("id", "boxes") match { 
     case Seq(JsString(id), boxes) => Container(id, boxes.convertTo[List[Box]]) 
     } 
     override def write(obj: Container): JsValue = ??? 
    } 
    } 

編譯時,我收到了這個錯誤信息。spray-json反序列化問題

Cannot find JsonReader or JsonFormat type class for app.Main.Container 
    [error]   case Seq(JsString(id), container) => Box(id, container.convertTo[Container]) 
    [error]                  ^
    [error] one error found 
    [error] (compile:compileIncremental) Compilation failed 

我認爲這是因爲盒子和容器互爲對方。我怎麼解決這個問題?

回答

0

解決

case class Box(id: String, container: Container) 
    case class Container(id: String, boxes: List[Box]) 

    object CustomProtocol extends DefaultJsonProtocol { 
    implicit object BoxFormat extends JsonFormat[Box] { 
     override def read(json: JsValue): Box = json.asJsObject.getFields("id", "container") match { 
     case Seq(JsString(id), container) => Box(id, container.convertTo[Container](ContainerFormat)) 
     } 
     override def write(obj: Box): JsValue = ??? 
    } 

    implicit object ContainerFormat extends JsonFormat[Container] { 
     override def read(json: JsValue): Container = json.asJsObject.getFields("id", "boxes") match { 
     case Seq(JsString(id), boxes) => Container(id, boxes.convertTo[List[Box]](listFormat(BoxFormat))) 
     } 
     override def write(obj: Container): JsValue = ??? 
    } 
    }