Sto creando lettori JSON personalizzati per le classi del caso ma non è possibile trovare la classe di tipo JsonReader implicita per List [T], che viene utilizzata in altri casi.spray-json non riesce a trovare JsonReader per il tipo Elenco [T]
Quando ho controllato DefaultJsonProtocol, ha già il formato implicito per le raccolte;
implicit def listFormat[T :JsonFormat] = new RootJsonFormat[List[T]] {
def write(list: List[T]) = JsArray(list.map(_.toJson).toVector)
def read(value: JsValue): List[T] = value match {
case JsArray(elements) => elements.map(_.convertTo[T])(collection.breakOut)
case x => deserializationError("Expected List as JsArray, but got " + x)
}
}
Ecco il codice semplificato;
case class Test(i: Int, d: Double)
case class ListOfTest(t: List[Test])
trait TestResultFormat extends DefaultJsonProtocol {
import CustomFormat._
implicit object TestJsonFormat extends RootJsonReader[Test] {
override def read(json: JsValue): Test = {
val jsObject = json.asJsObject
val jsFields = jsObject.fields
val i = jsFields.get("i").map(_.convertTo[Int]).getOrElse(0)
val d = jsFields.get("d").map(_.convertTo[Double]).getOrElse(0d)
Test(i, d)
}
}
implicit object ListOfTestJsonFormat extends RootJsonReader[ListOfTest] {
override def read(json: JsValue): ListOfTest = {
val jsObject = json.asJsObject
val jsFields = jsObject.fields
val tests = jsFields.get("hs").map(_.convertTo[List[Test]]).getOrElse(List.empty)
ListOfTest(tests)
}
}
}
Ecco gli errori;
Error:(230, 53) not enough arguments for method convertTo: (implicit evidence$1: spray.json.JsonReader[List[com.xx.Test]])List[com.xx.Test].
Unspecified value parameter evidence$1.
val tests = jsFields.get("hs").map(_.convertTo[List[Test]]).getOrElse(List.empty)
^
Error:(230, 53) Cannot find JsonReader or JsonFormat type class for List[com.xx.Test]
val tests = jsFields.get("hs").map(_.convertTo[List[Test]]).getOrElse(List.empty)
^
Grazie per la risposta. L'ho appena imparato dal problema github. Per la soluzione pulita controlla la mia risposta, non penso che sia abbastanza pulita, ma non voglio sovrascrivere il metodo di scrittura sempre perché abbiamo molti formattatori personalizzati, è piuttosto sovraccarico, quindi ho creato un tratto base per farlo. –
Vedo :) Ho avuto questo problema molto tempo fa e mi sono abituato a scavalcare il metodo di scrittura (inutilizzato). Grazie. – ale64bit