我想使用json4s将案例类转换为Map[String, Any]
。我知道如何使用Scala反射来做到这一点,但是我不想处理代码中的复杂性。
使用json4s,可以轻松地将案例类转换为JsonAST.JValue
。使用JsonAST.JValue
,可以提取Map[String,Any]
。
但是,Map[String,Any]
与我的期望不符。
import org.json4s.native.JsonMethods._
import org.json4s._
import java.util.Currency
case class A(currency: Currency, i: Int, b: Boolean)
case object CurrencySerializer
extends CustomSerializer[Currency](
_ =>
({
case JString(s) => Currency.getInstance(s)
case JNull => null
}, {
case currency: Currency => JString(currency.getCurrencyCode)
})
)
implicit val formats = DefaultFormats + CurrencySerializer
val currency = Currency.getInstance("USD")
val a = A(currency, 1, true)
val json = Extraction.decompose(a)
val m = json.extract[Map[String,Any]]
在m: Map[String, Any]
中,
scala> m("i").asInstanceOf[BigInt]
res16: BigInt = 1
scala> m("b").asInstanceOf[Boolean]
res18: Boolean = true
scala> m("currency").asInstanceOf[Currency]
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Currency
... 38 elided
scala> m("currency").asInstanceOf[String]
res23: String = USD
m("currency")
实际上是String
,但是我希望它是java.util.Currency
。
我想我知道原因。中间值json
为JObject(List((currency,JString(USD)), (i,JInt(1)), (b,JBool(true))))
,即,货币在JString("USD")
中表示为JsonAST.JValue
。然后执行code以返回String
。
我的分析正确吗?我可以做些什么来使m("currency")
成为java.util.Currency
吗? (同时仍在使用json4s)