Мне нужно отобразить отсортированную карту по пользовательскому типу. 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:_*)
}
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)
}:_*)
}
Похожие вопросы
Новые вопросы
json
JSON (нотация объектов JavaScript) — это сериализуемый формат обмена данными, который может быть прочитан машиной и человеком. Не используйте этот тег для собственных объектов JavaScript или литералов объектов JavaScript. Прежде чем задать вопрос, подтвердите свой JSON с помощью валидатора JSON, такого как JSONLint (https://jsonlint.com).