3

Map[IndexedSeq[String], Int] のデフォルトのフォーマットは scala にはないと思います (そうですか?) ので、次のように独自のフォーマットを作成しましたが、非常に遅いです。これを行うより良い方法はありますか?

class IndexedSeqToIntMapFormat() extends Format[Map[IndexedSeq[String], Int]] {

 def writes(o: Map[IndexedSeq[String], Int]): JsValue = {
   val mapItems: Seq[String] = o.toSeq.map{case (rowKey, index) => (index.toString +: rowKey).mkString(",")}
   Json.obj("items" -> Json.toJson(mapItems))
 }

 def reads(json: JsValue): JsResult[Map[IndexedSeq[String], Int]] = {
   val mapItemsAsString: IndexedSeq[String] = (json \ "items").as[IndexedSeq[String]]
   val map: Map[IndexedSeq[String], Int] = mapItemsAsString.map(itemAsString => {
     val item: IndexedSeq[String] = itemAsString.split(",").toIndexedSeq
     val rowKey: IndexedSeq[String] = item.tail
     val rowIndex: Int = item.head.toInt
     (rowKey, rowIndex)
   }).toMap

   JsSuccess(map)
 }
}

ありがとう!

4

1 に答える 1

2

次のアプローチがあなたのアプローチよりも大幅に高速かどうかはわかりませんが、私の理解では、JSON の「精神」にはるかに準拠しています。JSON シリアライゼーションでは、各オブジェクトとそのすべてのサブオブジェクトおよび属性に、それらが何であるかによって名前を付ける必要があります。私の意見では、複雑なオブジェクトのカスタム文字列シリアル化のリストは、実際の JSON 表現ではありません。

「適切な」JSON の方法で実行すると、文字列の追加の解析作業は必要なく、必要な場所にすべてのデータが既に提供されているため、少なくとも解析の時間を節約できます。そして、コードははるかに読みやすく見えます:-)

結果の JSON は次のようになります。

"items": [
  { "keySeq": [ "key1", "key2", "key3" ], "value": 42 },
  { "keySeq": [ "key4", "key5" ], "value": 123 },
  { "keySeq": [ "key6", "key7", "key7" ], "value": 650 }
]

フォーマッタは次のようになります。

class IndexedSeqToIntMapFormat() extends Format[Map[IndexedSeq[String], Int]] {

  def writes(m: Map[IndexedSeq[String], Int]): JsValue = {
    val objs = m.toSeq.map { case (keySeq, value) =>
      Json.obj("keySeq" -> Json.toJson(keySeq), "value" -> JsNumber(value))
    }
    Json.obj("items" -> JsArray(objs))
  }

  def reads(json: JsValue): JsResult[Map[IndexedSeq[String], Int]] = {
    val seq = (json \ "items").as[Seq[JsValue]] map { obj =>
      ( (obj \ "keySeq").as[IndexedSeq[String]], (obj \ "value").as[Int] )
    }
    JsSuccess(seq.toMap)
  }
}

ところで、好奇心からですが、どのような状況でそのような地図が必要か教えていただけますか?

于 2016-02-23T13:51:55.020 に答える