1

次の形式の受信データ フィードがあります。

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

これを次の形式のケース クラスに解析します。

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

私が見たjsonパス読み取り操作のすべての例は、1つのノードから1つのプロパティへの完全な直接マッピングのみを含みます.複数のノードがあり、場合によってはリストから単数への変換がある操作をどのように処理しますか

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 ツリーを 2 回反復し、2 回「より適切な形式」の json を構築し、次に値を抽出するときにもう一度実行する必要があることです。

また、キーと値のペアのコレクション (この場合は属性) に関係のないデータが多数含まれている場合、抽出したいビットと共にそのデータを変換するための代償を払っています。

問題が解決するので、この回答を受け入れますが、誰かが優れたソリューションを提供できるかどうかを確認するために戻ってきます(そこに1つあると確信しており、それを学びたいです)

于 2013-07-30T09:18:26.323 に答える