对于这些类:
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
发布评论