You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:06:05