使用json4s将案例类转换为Map [String,Any]

时间:2018-10-15 21:56:16

标签: scala json4s

我想使用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

我想我知道原因。中间值jsonJObject(List((currency,JString(USD)), (i,JInt(1)), (b,JBool(true)))),即,货币在JString("USD")中表示为JsonAST.JValue。然后执行code以返回String

我的分析正确吗?我可以做些什么来使m("currency")成为java.util.Currency吗? (同时仍在使用json4s)

0 个答案:

没有答案