2017-05-04 96 views
0

转换我有以下简单的代码matcherror例外,而试图JSON字符串

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$1(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$1.apply(App.scala:76) 
    at scala.App$$anonfun$main$1.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) 

我在做什么错? 最好的问候, Vishal

回答

0

您在您的Json "AP_details"。你正在做一个getFields("AP_Details")

注意small ddetailsDetailscapital D。这导致一个空的Vector。但是你还没有处理空矢量的情况,因此你的匹配失败了,这会给你一个匹配错误。

现在...一旦你删除这个问题,那么你有另一个问题照顾。

所以,你有一个,

case class APDetail(val mac_id:String) 

然后你像这样定义的JsonFormat,

implicit val APDetailFormat = jsonFormat1(APDetail) 

现在...这将期望的Json有确切的字段名,其是mac_id每个APDetail但您的Json有MAC_Address。所以这不适合你。

所以,你必须先解决您的案例类(或为其提供适当的JsonFormat),

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]])    
} 
+0

魔鬼在'Details' ... –