尝试转换 Json 字符串时发生匹配错误异常
matcherror exception while trying to convert Json string
我有以下简单代码
val fileLine = s"""{"AP_details": [{"MAC_Address": "00:11:74:00:00:00"},{"MAC_Address": "00:11:74:00:00:00"},{"MAC_Address": "00:11:74:00:00:00"}]}
"""
val jsonAst = fileLine.parseJson
import APDetailsJsonProtocol._
jsonAst.convertTo[APDetails]
转换在另一个文件中定义为
打包测试
导入 spray.json._
导入 DefaultJsonProtocol._
case class APDetails(val mAPRadioOperatingParams:List[APDetail])
case class APDetail(val mac_id:String)
object APDetailsJsonProtocol extends DefaultJsonProtocol {
implicit val APDetailFormat = jsonFormat1(APDetail)
implicit object APDetailsJsonFormat extends RootJsonFormat[APDetails] {
def write(c: APDetails) = ???
def read(value: JsValue) = value.asJsObject.getFields("AP_Details") match
{
case Seq(jsv ) => new APDetails(jsv.convertTo[List[APDetail]])
}
}
}
但是我得到以下异常
Exception in thread "main" scala.MatchError: Vector() (of class scala.collection.immutable.Vector)
at test.APDetailsJsonProtocol$APDetailsJsonFormat$.read(APDetails.scala:13)
at test.APDetailsJsonProtocol$APDetailsJsonFormat$.read(APDetails.scala:11)
at spray.json.JsValue.convertTo(JsValue.scala:31)
at test.bootStrap.<init>(bootStrap.scala:25)
at test.TestApp$.delayedEndpoint$test$TestApp(TestApp.scala:10)
at test.TestApp$delayedInit$body.apply(TestApp.scala:4)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at test.TestApp$.main(TestApp.scala:4)
at test.TestApp.main(TestApp.scala)
我做错了什么?
最好的祝福,
维沙尔
您的 Json 中有 "AP_details"
个。你正在做 getFields("AP_Details")
.
请注意 details
中的 small d
和 Details
中的 capital D
。这会导致一个空 Vector。但是你没有处理空向量的情况,因此你的匹配失败,这给你一个匹配错误。
现在...一旦您解决了这个问题,您就会有另一个问题需要处理。
所以你有一个,
case class APDetail(val mac_id:String)
然后你为它定义了一个Json格式,
implicit val APDetailFormat = jsonFormat1(APDetail)
现在...这将期望 Json 具有确切的字段名称,即每个 APDetail
的 mac_id
但您的 Json 具有 MAC_Address
.所以这对你不起作用。
因此您必须先修复您的案例 class(或为其提供适当的 Json格式),
case class APDetail(Mac_Address: String)
现在...你的read
还有一个问题,应该是这样的,
def read(value: JsValue) = value.asJsObject.getFields("AP_details") match {
case Seq(jsv): Seq[JsArray] => new APDetails(jsv.convertTo[List[APDetail]])
}
我有以下简单代码
val fileLine = s"""{"AP_details": [{"MAC_Address": "00:11:74:00:00:00"},{"MAC_Address": "00:11:74:00:00:00"},{"MAC_Address": "00:11:74:00:00:00"}]}
"""
val jsonAst = fileLine.parseJson
import APDetailsJsonProtocol._
jsonAst.convertTo[APDetails]
转换在另一个文件中定义为
打包测试 导入 spray.json._ 导入 DefaultJsonProtocol._
case class APDetails(val mAPRadioOperatingParams:List[APDetail])
case class APDetail(val mac_id:String)
object APDetailsJsonProtocol extends DefaultJsonProtocol {
implicit val APDetailFormat = jsonFormat1(APDetail)
implicit object APDetailsJsonFormat extends RootJsonFormat[APDetails] {
def write(c: APDetails) = ???
def read(value: JsValue) = value.asJsObject.getFields("AP_Details") match
{
case Seq(jsv ) => new APDetails(jsv.convertTo[List[APDetail]])
}
}
}
但是我得到以下异常
Exception in thread "main" scala.MatchError: Vector() (of class scala.collection.immutable.Vector)
at test.APDetailsJsonProtocol$APDetailsJsonFormat$.read(APDetails.scala:13)
at test.APDetailsJsonProtocol$APDetailsJsonFormat$.read(APDetails.scala:11)
at spray.json.JsValue.convertTo(JsValue.scala:31)
at test.bootStrap.<init>(bootStrap.scala:25)
at test.TestApp$.delayedEndpoint$test$TestApp(TestApp.scala:10)
at test.TestApp$delayedInit$body.apply(TestApp.scala:4)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at test.TestApp$.main(TestApp.scala:4)
at test.TestApp.main(TestApp.scala)
我做错了什么? 最好的祝福, 维沙尔
您的 Json 中有 "AP_details"
个。你正在做 getFields("AP_Details")
.
请注意 details
中的 small d
和 Details
中的 capital D
。这会导致一个空 Vector。但是你没有处理空向量的情况,因此你的匹配失败,这给你一个匹配错误。
现在...一旦您解决了这个问题,您就会有另一个问题需要处理。
所以你有一个,
case class APDetail(val mac_id:String)
然后你为它定义了一个Json格式,
implicit val APDetailFormat = jsonFormat1(APDetail)
现在...这将期望 Json 具有确切的字段名称,即每个 APDetail
的 mac_id
但您的 Json 具有 MAC_Address
.所以这对你不起作用。
因此您必须先修复您的案例 class(或为其提供适当的 Json格式),
case class APDetail(Mac_Address: String)
现在...你的read
还有一个问题,应该是这样的,
def read(value: JsValue) = value.asJsObject.getFields("AP_details") match {
case Seq(jsv): Seq[JsArray] => new APDetails(jsv.convertTo[List[APDetail]])
}