Мне нужно отобразить отсортированную карту по пользовательскому типу. SortedMap [X, Seq [Y]]

Библиотека Json должна отображать карту в порядке, указанном X.name

case class X(order: Int, name: String) extends Ordered[X]

Предположим, у меня есть X (1, ​​«Джеймс»), X (2, «Мел»), X (3, «Эшли»). Выходная карта должна быть

«Джеймс»: Seq (Y)

«Мел»: Seq (Y)

«Эшли»: Seq (Y)

InMap правильно отсортирован (с точки зрения отладчика), но после рендеринга порядок сортировки (X.order) теряется. Вероятно, из-за ошибки toSeq. Любые идеи?

implicit val myWrites = new Writes[SortedMap[X, Seq[Y]]] {
    def writes(inMap: SortedMap[X, Seq[Y]]): JsValue =
      Json.obj(inMap.map {case (s, o) =>
        val r: (String, JsValueWrapper) = s.name() -> Json.toJson(o)
        r
      }.toSeq:_*)
  }
0
merma 24 Июл 2020 в 06:30

1 ответ

Лучший ответ

Так...

  • Я ни разу не встречал слово "рендеринг" в качестве "преобразовать в"
  • упорядочение по ключевому исходному ключу в SortedSet теряется после сопоставления, потому что вы меняете тип ключа, поэтому результат упорядочивается по новому типу ключа (здесь: String)
  • если вы хотите сохранить порядок элементов между сопоставлениями, я бы предложил использовать ListMap
  • хотя в вашем конкретном случае вы можете избавиться от Seq кортежей, так как в конце дня это то, что вам нужно произвести
implicit val myWrites: Writes[SortedMap[X, Seq[Y]]] = new Writes[SortedMap[X, Seq[Y]]] {
  def writes(inMap: SortedMap[X, Seq[Y]]): JsValue =
    Json.obj(inMap.toSeq.map { case (s, o) =>
      s.name() -> Json.toJson(o)
    }:_*)
}
0
Mateusz Kubuszok 24 Июл 2020 в 07:39