如何在 json 库(播放框架)中渲染排序地图?

How to render a sorted map in json libraries (of play framework)?

我需要按用户定义的类型渲染排序的地图。 SortedMap[X, Seq[Y]]

Json 库应按照 X.name

的顺序渲染地图
case class X(order: Int, name: String) extends Ordered[X]

假设我有 X(1, "James"), X(2, "Mel"), X(3, "Ashley")。 输出图应该是

“詹姆斯”:Seq(Y)

“梅尔”:序列(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:_*)
  }

所以...

  • 我从没见过“渲染”这个词被用作“转换为”
  • SortedSet 中的按键排序在映射后丢失,因为您更改了键类型,因此结果按新的键类型排序(此处:字符串)
  • 如果你想保留映射之间的项目顺序,我建议使用 ListMap
  • 尽管在您的特定情况下您可以取消元组的序列,因为在一天结束时,这就是您需要生成的
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)
    }:_*)
}