我正在尝试使用Play中的Json库序列化地图。我写了自己的写作,因为地图没有。
import play.api.libs.json.Json._
import play.api.libs.json._
object NestedArray extends App {
val m: Map[Int, String] = Map(1 -> "one", 2 -> "two")
implicit val mWrites = new Writes[Map[Int, String]] {
def writes(m: Map[Int, String]) = arr(
m.keys.map(k => {
obj("key" -> k.toString,
"value" -> m(k)
)
})
)
}
val j = toJson[Map[Int, String]](m)
println(prettyPrint(j))
}
输出是这样的:
[ [ {
"key" : "1",
"value" : "one"
}, {
"key" : "2",
"value" : "two"
} ] ]
正如您所看到的,项目周围有两对[]。当我在地图周围使用Wrapper类时,我只得到一对[]。
case class Wrap(m: Map[Int, String])
val w = new Wrap(m)
implicit val wrapWrites = new Writes[Wrap] {
def writes(w: Wrap) = obj(
"m" -> w.m.keys.map(k => {
obj("key" -> k.toString,
"value" -> w.m(k)
)
})
)
}
val j2 = toJson[Wrap](w)
println(prettyPrint(j2))
输出:
{
"m" : [ {
"key" : "1",
"value" : "one"
}, {
"key" : "2",
"value" : "two"
} ]
}
有没有办法在没有包装类的情况下实现呢?
答案 0 :(得分:1)
Json.arr
从它的参数列表中生成一个JSON数组。由于第一个参数本身就是一个序列,因此结果是一个序列的序列。
E.g。
scala> Json.arr(1,2,3)
res1: play.api.libs.json.JsArray = [1,2,3]
scala> Json.arr(List(1,2,3))
res2: play.api.libs.json.JsArray = [[1,2,3]]
删除对arr
的调用并使用toJson将Iterable直接转换为JSON删除嵌套数组
import play.api.libs.json.Json._
import play.api.libs.json._
object NestedArray extends App {
val m: Map[Int, String] = Map(1 -> "one", 2 -> "two")
implicit val mWrites = new Writes[Map[Int, String]] {
def writes(m: Map[Int, String]): JsValue =
Json.toJson(m.keys.map(k => {
obj("key" -> k.toString,
"value" -> m(k)
)
}))
}
val j = toJson[Map[Int, String]](m)
println(prettyPrint(j))
}
答案 1 :(得分:0)
Play确实提供了Writes[Map[String, _]]
,您可以根据自己的需要进行调整。似乎没有必要创建表示一系列键值对的结构,这就是JSON对象已经的原因。请参阅我对类似问题的回答:How to serialize a Map[CustomType, String] to JSON