为对象序列提供JsonFormat [英] Providing a JsonFormat for a Sequence of Objects
问题描述
对于这些类:
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),但这又是一个序列...
查看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"
}]
}
i`m trying here to find some help to apply an JsonFormat extended of the DefaultJsonProtocol to an class containing a Sequence of Objects.
So for the classes:
class Person(val name: String, [......], val adresses: Seq[Adress])
class Adress(val streetname: String, val plz: BigDecimal, val city: String)
now i would like to apply my 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) = {...}
}
But actually i am not sure how to do it. I searched through the spray-json documentation and throug google, stackoverflow & Co. I am totally new to Scala/Spray and perhaps i am just missing the point. So perhaps somebody here is so kind to help me. Without the Adress sequence i will work.
With the JsArray as provided in the example i get an type mismatch. It is exspecting an List[JsValue] but also with converting to list the mismatch still stands.
I also tried to inserts an seperate AdressJsonProtocol and include it via: "addresses" -> AdressJsonFormat.write(pers.adresses) but yet again it is an Sequence...
Look at the source of spray.json.CollectionFormats
.
Here is a runnable implementation:
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))
}
which yields:
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"
}]
}
这篇关于为对象序列提供JsonFormat的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!