为对象序列提供JsonFormat

编程入门 行业动态 更新时间:2024-10-23 19:31:20
本文介绍了为对象序列提供JsonFormat的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我试图在这里找到一些帮助,以应用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),但这又是一个序列...

解决方案

查看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

本文发布于:2023-11-25 12:08:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1629684.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:序列   对象   JsonFormat

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!