我正在尝试找到一些帮助来应用DefaultJsonProtocol的JsonFormat扩展 到包含对象序列的类。
所以对于课程:
class Person(val name: String, [......], val adresses: Seq[Adress])
class Adress(val streetname: String, val plz: BigDecimal, val city: String)
现在我想申请我的JsonFormat:
object PersonJsonProtocol extends DefaultJsonProtocol {
implicit object PersonJsonFormat extends RootJsonFormat[Person] {
def write(pers: Person) = JsObject(
"name" -> JsString(pers.name),
[......],
"adresses" -> JsArray(pers.adresses)
)
def read(value: JsValue) = {...}
}
但实际上我不知道该怎么做。 我通过spray-json文档搜索并通过google,stackoverflow&公司 我对Scala / Spray完全不熟悉,也许我只是错过了重点。所以也许有人在这里帮助我。如果没有地址序列,我将会工作。
使用示例中提供的JsArray,我得到类型不匹配。它是一个明确的List [JsValue],但也转换为列表,不匹配仍然存在。
我还试图插入一个单独的AdressJsonProtocol并通过以下方式包含它: “地址” - > AdressJsonFormat.write(pers.adresses)但又是一个序列...
答案 0 :(得分:9)
您不需要为每个案例类编写一个DefaultJsonProtocol,除非您需要一些特殊逻辑(格式化,过滤......)
您是否尝试过使用默认的案例类序列化?
implicit val formatPerson = jsonFormat6(Adress)
implicit val formatAddress = jsonFormat3(Adress)
jsonFormat' number '中的数字代表案例类中的成员数。
然后,在序列化Person时,spray-json会处理嵌套的Address集合。
答案 1 :(得分:3)
查看spray.json.CollectionFormats
的来源。
这是一个可运行的实现:
import spray.json._
class Adress(val streetname: String, val plz: BigDecimal, val city: String)
class Person(val name: String, val adresses: Seq[Adress])
object PersonJsonProtocol extends DefaultJsonProtocol {
implicit object AdressJsonFormat extends RootJsonFormat[Adress] {
def write(addr: Adress) = JsObject(Map(
"streetname" -> JsString(addr.streetname),
"plz" -> JsNumber(addr.plz),
"city" -> JsString(addr.city)
))
def read(value: JsValue): Adress = ???
}
implicit object PersonJsonFormat extends RootJsonFormat[Person] {
def write(pers: Person) = JsObject(Map(
"name" -> JsString(pers.name),
"adresses" -> JsArray(pers.adresses.map(_.toJson).toList)
))
def read(value: JsValue): Person = ???
}
}
object Main extends App {
import PersonJsonProtocol._
val person = new Person("joe", Seq(new Adress("street", 123, "city")))
println("poso's default toString: %s".format(person))
val personJVal = person.toJson
println("JValue's toString: %s".format(personJVal))
val personJson = personJVal.prettyPrint
println("pretty-printing: %s".format(personJson))
}
产生:
poso's default toString: Person@680ccad
JValue's toString: {"name":"joe","adresses":[{"streetname":"street","plz":123,"city":"city"}]}
pretty-printing: {
"name": "joe",
"adresses": [{
"streetname": "street",
"plz": 123,
"city": "city"
}]
}