1、需求
自定义实现Scala封装类,能够设定key-value值,并生成Json格式字符串,value值类型为任意,生成方法满足多级Json格式的需要
2、实践开发
2.1、引入pom依赖
通过Scala实现使用json4s依赖实现,也可以使用阿里的fastjson依赖
pom依赖如下:
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-native_${scala.version}</artifactId>
<version>3.6.1</version>
</dependency>
2.2、Scala代码实现
package cn.ScalaCustoms
import org.json4s.DefaultFormats
import org.json4s.native.Json
import scala.collection.mutable.Map
/**
* @Author: Henry
* @Description: 封装类生成JSON字符串
* @Date: Create in 2019/5/27 12:30
**/
class JsonOne{
private var converMap:Map[String,Any] = Map()
private var moreMap:Map[String,Any] = Map()
private var IsAddMoreData = false
/**
* @描述 : 辅助构造器
* @参数 : Data: Tuple2[String,Any]
* @创建时间 : 2019/5/27
*/
def this(Data: Tuple2[String,Any]) {
this() // 调用主构造器
}
/**
* @描述 : 添加一级json
* @参数 : Data: Tuple2[String,Any]
* @返回值 : Map[String,Any]
* @创建时间 : 2019/5/27
*/
def dataAdd(Data: Tuple2[String,Any]):Map[String,Any]={
this.converMap
this.converMap += ( Data._1 -> Data._2 )
}
/**
* @描述 : 添加二级json
* @参数 : Data: Tuple2[String,Any]
* @返回值 : Map[String,Any]
* @创建时间 : 2019/5/27
*/
def moreAdd(Data: Tuple2[String,Any]):Map[String,Any]={
this.moreMap
this.moreMap += (Data._1 -> Data._2)
}
/**
* @描述 : 设置二级json pair的 key 值
* @参数 : Type: String
* @返回值 : Map[String,Any]
* @创建时间 : 2019/5/27
*/
def moreSet(Type: String):Map[String,Any]={
this.converMap
this.moreMap
this.converMap += ( Type -> this.moreMap )
}
/**
* @描述 : 获取json字符串对应Map格式
* @返回值 : Map[String,Any]
* @创建时间 : 2019/5/27
*/
def getData:Map[String,Any] =
this.converMap
/**
* @描述 : 重写toString方法,构造Json字符串
* @返回值 : String
* @创建时间 : 2019/5/27
*/
override def toString: String = {
val JsonStr = Json(DefaultFormats).write(converMap).toString
JsonStr
}
}
2.3、对象使用方法
有两种方法创建Json字符串的实现方法
- Way1:
- Step1:创建JsonOne对象,val eg = new JsonOne()
- Step2: 添加一级json ,使用dataAdd方法,eg.dataAdd(“I”,6)
- Step3: 添加二级json ,先调用moreAdd方法添加二级pair ,eg.moreAdd(“I”,6)
- Step4:设置二级json ,再调用moreSet方法,设置二级pair的key,eg.moreSet(“D”)
Way2: - Step1:创建JsonOne对象,val eg = new JsonOne()
- Step2: 添加一级json ,使用dataAdd方法,eg.dataAdd(“I”,6)
- Step3:创建二级Map,如val de = Map(“Id” -> 66 , “Value” -> 0.96 )
- Step4:添加一级,使用dataAdd方法,eg.dataAdd(“data”,de)
3、功能实现
3.1、Way1方法运行
Main函数如下:
package cn.test
import cn.ScalaCustoms.JsonOne
import scala.collection.mutable.Map
/**
* @Author: Henry
* @Description: ${description}
* @Date: Create in 2019/5/27 14:41
**/
object test {
def main(args: Array[String]): Unit = {
val json1 = new JsonOne()
val de = Map("Id" -> 66 , "Value" -> 0.96 ) // 添加二级data json
json1.dataAdd("data",de)
json1.dataAdd("type", "mypay_Equip") // 添加一级 json
println("JSON 格式: " + json1)
println("Map 格式: " + json1.getData)
}
}
运行结果:

3.2、Way2方法运行
Main函数如下:
package cn.test
import cn.ScalaCustoms.JsonOne
import scala.collection.mutable.Map
/**
* @Author: Henry
* @Description: ${description}
* @Date: Create in 2019/5/27 14:41
**/
object test {
def main(args: Array[String]): Unit = {
val json1 = new JsonOne()
json1.dataAdd("type", "mypay_Equip") // 添加一级 json
json1.moreAdd("Id",66) // 添加二级data json
json1.moreAdd("Value", "0.96")
json1.moreSet("data")
json1.moreAdd("time",6.16)
json1.moreSet("data")
println("JSON 格式: " + json1)
println("Map 格式: " + json1.getData)
}
}
运行结果:

4、补充
Scala中class 和 case class 的区别:
本质上来讲,class case class用起来就是一样的: 最不一样的一个东西:如果我们scala要做模式匹配,去匹配类型的话,建议使用case case 因为scala的底层对它做了优化,匹配起来性能较好。
- :case class 自动生成伴生对象,自动实现了apply方法
- :case class 用于做匹配,性能较好(scala的底层做过优化)
- :case class 默认实现了序列化 Serializable
- :case class 默认实现了toString、equals、equals 和 hashCode等方法
- :case class 主构造函数 里面没有修饰符,默认的是val
- :case class 初始化的时候可以不用new,当然也可以加上,class 类一定需要加new
博客围绕Scala自定义封装类生成多级Json格式字符串展开。先提出需求,接着介绍实践开发,包括引入pom依赖、Scala代码实现及对象使用方法,有两种创建Json字符串的方式。还展示了两种方法的运行情况,最后补充了Scala中class和case class的区别。

647

被折叠的 条评论
为什么被折叠?



