scala – spray-json找不到类型为List [T]的JsonReader
发布时间:2020-12-16 18:52:52 所属栏目:安全 来源:网络整理
导读:我正在为case类创建自定义json读取器,但它找不到List [T]的隐式JsonReader类型类,它在其他case类中使用. 当我检查DefaultJsonProtocol时,它已经具有集合的隐式格式; implicit def listFormat[T :JsonFormat] = new RootJsonFormat[List[T]] { def write(list
我正在为case类创建自定义json读取器,但它找不到List [T]的隐式JsonReader类型类,它在其他case类中使用.
当我检查DefaultJsonProtocol时,它已经具有集合的隐式格式; 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) } } 这是简化的代码; 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) } } } 这是错误; 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) ^ 解决方法
我认为这个问题与DefaultJsonProtocol中List [T]的JsonReader是RootJsonFormat(不是RootJsonReader)有关,这基本上意味着你可以读取它并写入它.因此,当您尝试读取List [Item]时,您还可以编写Items.因此,您可以使用RootJsonFormat,并在尝试编写它时抛出异常(因为您不支持它).例如:
import spray.json._ implicit object TestJsonFormat extends RootJsonFormat[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) } override def write(obj: Test): JsValue = serializationError("not supported") } 如果你知道一个只涉及读者的干净解决方案,请告诉我,因为我自己遇到了这个问题而找不到任何其他问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |