




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
spray-json框架介绍一、前言 Json作为目前最流行的数据交换格式,具有众多优势,在Scala语言中以及当我们使用Geotrellis前后台交换数据的时候都少不了要使用Json,本文为大家介绍一款开源的Json处理框架spray-json。二、spray-json简介 spray-json是一款使用Scala语言编写的开源Json处理框架。GitHub地址:/spray/spray-json。其中对其介绍如下:spray-json is a lightweight, clean and efficient JSON implementation in Scala.It sports the following features: A simple immutable model of the JSON language elements An efficient JSON parser Choice of either compact or pretty JSON-to-string printing Type-class based (de)serialization of custom objects (no reflection, no intrusion) No external dependenciesspray-json allows you to convert between String JSON documents JSON Abstract Syntax Trees (ASTs) with base type JsValue instances of arbitrary Scala types 大意就是spray-json轻量、无依赖、高效,没有使用反射等。可以在JSON字符串对象、AST(JSON树)对象、Scala类型之间任意转换。 在Scala程序中使用spray-json,只需要在build.sbt文件中添加libraryDependencies += io.spray % spray-json % 1.3.2,然后更新sbt即可。三、spray-json使用 总体上使用spray-json需要先定义一个转换的协议(Protocol),该协议指定了如何在Scala对象与JOSN对象之间进行转换。spary-json也提供了一些基础类型的转换协议,在DefaultJsonProtocol类中。3.1 基础类型转换 首先引入spray-json以及DefaultJsonProtocolimport spray.json._import DefaultJsonProtocol._ 然后可以直接进行类型转换,代码如下:val str = name:wsf, age:26val json: JsValue = str.toJsonval json2 = str.parseJsonprintln(json2.prettyPrint)println(pactPrint)val age = 26val json_age = age.toJsonjson_age.convertToInt 使用toJson和parseJson都能将字符串或其他类型转换成JsValue,prettyPrint是将json以分行的方式优雅的输出,compactPrint直接在一行压缩输出,convertTo可以直接将json对象转为Scala对应的类型。 DefaultJsonProtocol支持的数据类型列表如下:Byte, Short, Int, Long, Float, Double, Char, Unit, BooleanString, SymbolBigInt, BigDecimalOption, Either, Tuple1 - Tuple7List, Arrayimmutable.Map, Iterable, Seq, IndexedSeq, LinearSeq, Set, Vectorcollection.Iterable, Seq, IndexedSeq, LinearSeq, SetJsValue3.2 case class类型转换 如果不在DefaultJsonProtocol支持的数据类型中就需要我们自己定义JsonProtocol,最简单的类型是case class,其方法如下:case class MyInt(value: Int)object MyIntProtocol extends DefaultJsonProtocol implicit val format = jsonFormat1(MyInt) import MyIntProtocol._val json2 = MyInt(10).toJsonprintln(json2)val myInt = json2.convertToMyIntprintln(myInt) 简单的说就是定义一个object类,并添加一个隐式参数,参数的值为jsonFormatX(X表示数字)函数将自定义的case类传入。 这里需要说明的是自定义的case类有几个属性这里X就为几,即调用相应的函数。如果case类还定义了伴随的object类,那么jsonFormatX函数就需要传入MyInt.apply。并且MyIntProtocol类的定义不能放在调用位置的后面,否则会出错。3.3 包含泛型的类型转换 如果case类的属性中包含了泛型那么实现方法稍有不同,代码如下:case class MyListA(name: String, items: ListA)object MyListProtocol extends DefaultJsonProtocol implicit def myListFormatA: JsonFormat = jsonFormat2(MyList.applyA)import MyListProtocol._val json3 = MyListInt(wsf, List(1, 2, 3).toJsonprintln(json3.prettyPrint)val myList = json3.convertToMyListIntprintln(myList) 同样是定义一个object类,并添加一个隐式函数,不同的是传入的是MyList.applyA,即apply加泛型,并且需要指明返回类型为A: JsonFormat。此处还需要说明的是在基本的case类中定义隐式变量的时候用的是implicit val,而此处用的是implicit def,个人理解是在scala中变量与函数的定义比较模糊,二者基本是等价的,但是此处返回值的类型是泛型,所以要用def。3.4 普通class类的转换 如果是一个普通的class类,就需要自己定义write和read方法。代码如下:class Person(val name: String, val age: Int)object MyPersonProtecol extends DefaultJsonProtocol implicit object myPersonFormat extends RootJsonFormatPerson override def write(person: Person): JsValue = JsArray(JsString(), JsNumber(person.age) override def read(json: JsValue): Person = json match case JsArray(Vector(JsString(name), JsNumber(age) = new Person(name, age.toInt) case _ = deserializationError(Person expected) import MyPersonProtecol._val person = new Person(wsf, 26)val json = person.toJsonprintln(json.prettyPrint)val per = json.convertToPerson 此处相当于隐式format不在由jsonFormatX函数返回,而是自定义一个类并继承自RootJsonFormat。上述代码将Person实例转换成JsArray,既json数组对象,Person的各个属性按照定义的顺序存放到数组,同时也可以将json数组对象转换为Person实例。如果我们需要的是一个标准的json树对象而不仅仅是json数组,可以按照下述方式定义隐式对象。implicit object myPersonFormat2 extends RootJsonFormatPerson override def write(person: Person): JsValue = JsObject( name - JsString(), age - JsNumber(person.age) ) override def read(json: JsValue): Person = json.asJsObject.getFields(name, age) match case Seq(JsString(name), JsNumber(age) = new Person(name, age.toInt) case _ = deserializationError(Person expected) 上述代码将Person对象转换成如下形式的json树对象,当然也可实现反向转换。 name: wsf, age: 263.5 递归类型转换 如果是case类属性又包含自身,既递归类型,在定义隐式对象的时候稍有不同,需要显式指明对象的属性,并将jsonFormat的结果传给lazyFormat,我想这里主要是为了防止递归过程中出现无限循环等错误。代码如下:case class Foo(i: Int, foo: OptionFoo)object myRecursiveProtocol extends DefaultJsonProtocol implicit val format: JsonFormatFoo = lazyFormat(jsonFormat(Foo, i, foo)import myRecursiveProtocol._val foo: Foo = Foo(1, Some(Foo(2, Some(Foo(3, None)val json = foo.toJsonprintln(json) 最终得到的结果如下:i:1,foo:i:2,foo:i:33.5 直接操作JSON对象 有时候可能我们并不需要这么复杂的功能,就想简单的拼接成JSON对象,这时候可以直接创建JsArray或者JsObject对象,按照自己的要求拼接即可。代码如下:val json = JsArray(JsNumber(1), JsNumbe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电网建设述职报告
- 赵洋技能安全培训课件
- 赵州桥公开课说课稿课件
- 消防员业务培训课件
- 走进湿地世界课件
- 消防三防安全培训课件
- 消火栓安全培训课件
- 消毒供应室院感管理课件
- 消毒供应中心包装课件
- 质量健康安全培训课件
- 2024年春季云南省高中学业水平合格性考试化学试卷真题(含答案)
- 石膏板项目可行性研究报告
- 2025年肠造口护理及并发症防治考核试题及答案
- 勘查地球物理导论课件
- 腹痛教学课件
- 2025年全国青少年学宪法讲宪法知识竞赛高中答案
- 学习《水利水电工程生产安全重大事故隐患判定导则-SLT 842》课件
- 2025年放射工作人员培训考试试题(+答案)
- 2025 临终患者症状管理课件
- 公寓管家培训课件
- 衡水市人防车位管理办法
评论
0/150
提交评论