1

我有一个表单的传入数据馈送:

{ attributes: [
 { name:"first", values=["1st"]},
 { name:"second", values=["2a", "2b"]}
]}

我想将其解析为以下形式的案例类:

case class TheThing(first:String, second:List[String])

我见过的所有 json 路径读取操作的示例只涉及从一个节点到一个属性的相当直接的映射,我如何处理有多个节点的操作以及在某些情况下从列表到单数的转换?

4

1 回答 1

0

因此,我提出的解决方案对于性能密集型代码没有好处,但是它提供了一个干净的映射接口。

object ThingReads {
  def reads(source:JsValue) = {
    val names:Seq[String] = (source \ "attributes" \\ "name").map(_.as[String])
    val values:Seq[JsValue] = source \ "attributes" \\ "values"
    val read = reads[TheThing] = (
      ( __ \ "first")(0).as[String] and
      ( __ \ "second").as[List[String]]
    )(TheThing.apply _)
    JsObject(names.zip(values)).as[TheThing](read)
  }
}

主要的缺点是您需要迭代 json 树两次,两次构建“更好的形式”json,然后在提取值时再次。

此外,如果您的键值对集合(在这种情况下为属性)中有很多不相关的数据,那么您就需要为转换这些数据以及要提取的位付出代价。

我会接受这个答案,因为它解决了问题,但我会继续回来看看是否有人可以提供更好的解决方案(我相信那里有一个,我很想学习它)

于 2013-07-30T09:18:26.323 回答