转换JSON数组并使用Play JSON分配给单值案例类

时间:2016-10-09 16:14:25

标签: json scala playframework

给出以下JSON对象:

{realtime-accesses: [
    {realtime-access: {
        level: 2
        marketID: 1
    }},
    {realtime-access: {
        level: 4
        marketID: 3
    }}
]
}

我想要一个看起来像这样的Scala对象:

RealTimeAccesses(Map(1->2,3->4))

这是我试图使用的代码:

  case class RealTimeAccesses(markets: Map[Int, Int])
  object RealTimeAccesses {
    implicit val realTimeAccessesFormatter: Format[RealTimeAccesses] = (
      (__ \ "realtime_accesses").format[List[Map[String, Map[String, Int]]]].map(
        _.iterator
        .flatMap(_.values)
        .map { v => v("marketID") -> v("level") }
        .toMap).inmap(m => RealTimeAccesses(m), (m: RealTimeAccesses) => m.markets))
  }

但是这不起作用,即时无法解析inmap上的符号。

我的问题是:

  1. 如何以我想要的方式完成这种转变?
  2. 是否可以使用type RealTimeAccess = Map[Int,Int]代替案例类?

1 个答案:

答案 0 :(得分:0)

它不起作用的原因是<p>没有仿函数。当您使用功能Format[A]致电map时,您将返回A => B而不是Reads[B]

Format[B]

因此,您需要立即致电val format1: Format[List[Map[String, Map[String, Int]]]] = (__ \ "realtime_accesses").format[List[Map[String, Map[String, Int]]]] val format2: Reads[Map[Int, Int]] = format1.map( _.iterator .flatMap(_.values) .map { v => v("marketID") -> v("level") } .toMap ) 并在.inmap内进行所有必要的转换。

inmap