如何在 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)
}:_*)
}
我需要按用户定义的类型渲染排序的地图。 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)
}:_*)
}