因此,我提出的解决方案对于性能密集型代码没有好处,但是它提供了一个干净的映射接口。
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,然后在提取值时再次。
此外,如果您的键值对集合(在这种情况下为属性)中有很多不相关的数据,那么您就需要为转换这些数据以及要提取的位付出代价。
我会接受这个答案,因为它解决了问题,但我会继续回来看看是否有人可以提供更好的解决方案(我相信那里有一个,我很想学习它)