如何使用spray-json将JsValue转换为Map[String, Any]并解决相关报错?
错误根因
你传入的JSON是数组结构(JsArray),而Map[String, Any]对应的JSON是键值对对象结构(JsObject),spray json反序列化时会严格校验结构匹配,因此直接转换抛出Expected Map as JsObject的错误。
解决方案
根据你的业务需求二选一即可:
方案1:保留原数组结构,转换为集合类型
不要直接转Map[String, Any],先转成List[Map[String, Any]],再按需处理单个元素。
首先需要自定义spray json的Any类型序列化规则,示例代码如下:
import spray.json._ implicit object AnyJsonFormat extends JsonFormat[Any] { override def write(x: Any): JsValue = x match { case n: Int => JsNumber(n) case l: Long => JsNumber(l) case s: String => JsString(s) case b: Boolean => JsBoolean(b) case m: Map[_, _] => JsObject(m.asInstanceOf[Map[String, Any]].mapValues(_.toJson).toMap) case arr: List[_] => JsArray(arr.map(_.toJson).toVector) case _ => JsNull } override def read(value: JsValue): Any = value match { case JsNumber(n) => if(n.isValidInt) n.intValue() else n.longValue() case JsString(s) => s case JsBoolean(b) => b case JsObject(fields) => fields.mapValues(_.convertTo[Any]).toMap case JsArray(elements) => elements.map(_.convertTo[Any]).toList case JsNull => null } } // 反序列化调用示例 val jsonStr = """[{"priority":1,"whoColumns":{"createdBy":"madhu","createdDate":1606111643373,"lastUpdatedBy":"manojkumar","lastUpdatedDate":1635923035513},"adType":1,"code":"pczpriy","id":3,"uploadDate":1606111560000,"payType":"P"},{"priority":1,"whoColumns":{"createdBy":"madhu","createdDate":1606111643373,"lastUpdatedBy":"manojkumar","lastUpdatedDate":1635923035513},"adType":1,"code":"pczpriy","id":3,"uploadDate":1606111560000,"payType":"P"}]""" val jsValue = jsonStr.parseJson // 转换为List<Map>结构 val resultList = jsValue.convertTo[List[Map[String, Any]]] // 按需取单个元素的Map结构 val singleMap = resultList.head
方案2:调整入参结构,适配Map类型要求
如果你的业务逻辑确实只需要接收单个Map,就把入参JSON的外层数组去掉,改为单个对象结构:
{ "priority":1, "whoColumns":{"createdBy":"madhu","createdDate":1606111643373,"lastUpdatedBy":"manojkumar","lastUpdatedDate":1635923035513}, "adType":1, "code":"pczpriy", "id":3, "uploadDate":1606111560000, "payType":"P" }
调整后直接调用jsValue.convertTo[Map[String, Any]]即可完成转换。
内容的提问来源于stack exchange,提问作者Hola Hola
相关产品推荐
相关产品推荐

