したがって、私が思いついた解決策は、パフォーマンスを集中的に使用するコードには適していませんが、マッピング用のクリーンなインターフェイスを提供します。
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 ツリーを 2 回反復し、2 回「より適切な形式」の json を構築し、次に値を抽出するときにもう一度実行する必要があることです。
また、キーと値のペアのコレクション (この場合は属性) に関係のないデータが多数含まれている場合、抽出したいビットと共にそのデータを変換するための代償を払っています。
問題が解決するので、この回答を受け入れますが、誰かが優れたソリューションを提供できるかどうかを確認するために戻ってきます(そこに1つあると確信しており、それを学びたいです)