使用json4s的框架,包括spark,flink

1、org.json4s 引入pom的方法

对于本地支持,引入以下依赖项添加到pom中

<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_${scala.version}</artifactId>
<version>{latestVersion}</version>
</dependency>

对于jackson支持,引入以下依赖项添加到pom中

<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_${scala.version}</artifactId>
<version>{latestVersion}</version>
</dependency>

2、Json4s 数据类型

json4s类型包括两个10个类型和一个type类型对象

case object JNothing extends JValue // 'zero' for JValue
case object JNull extends JValue
case class JString(s: String) extends JValue
case class JDouble(num: Double) extends JValue
case class JDecimal(num: BigDecimal) extends JValue
case class JInt(num: BigInt) extends JValue
case class JLong(num: Long) extends JValue
case class JBool(value: Boolean) extends JValue
case class JObject(obj: List[JField]) extends JValue
case class JArray(arr: List[JValue]) extends JValue type JField = (String, JValue)

JField不再是JValue这意味着更高的类型安全性,因为不再可能创建无效的JSON,例如 JFields 直接添加到JArrays中,此更改最明显的结果是map、transform、find和filter有两种版本:

def map(f: JValue => JValue): JValue
def mapField(f: JField => JField): JValue
def transform(f: PartialFunction[JValue, JValue]): JValue
def transformField(f: PartialFunction[JField, JField]): JValue
def find(p: JValue => Boolean): Option[JValue]
def findField(p: JField => Boolean): Option[JField]

3、使用org.json4s解析json字符串

提取不嵌套的json串

import org.json4s._
import org.json4s.native.JsonMethods._ // parse解析返回值为Jvalue
scala> parse("""{"name":"Toy","price":35.35}""", useBigDecimalForDouble = true)
res1: org.json4s.package.JValue =
JObject(List((name,JString(Toy)), (price,JDecimal(35.35))))

提取json中的元素的值
1)单层嵌套取单值

//val parseJson: JValue = parse( """{"name":"Toy","price":35.35}""", useBigDecimalForDouble = true)
val parseJson: JValue = parse( """{"name":"Toy","price":35.35}""") // 方法一:JString模式匹配方式
val JString(name) = (parseJson \ "name")
println(name) //方法二:extract[String]提取值,
val name:String = (parseJson \ "name").extract[String] // 直接提取内容(不安全)
val name:Option[String] = (parseJson \ "name").extractOpt[String]// 返回Option类型(安全)
val name: String = (parseJson \ "name").extractOrElse[String]("") // 设置默认值

2)多层嵌套套取单值

val parseJson: JValue = parse( """{"name":{"tome":"new"},"price":35.35}""", useBigDecimalForDouble = true)
println(parseJson)
// 方法一:逐层访问
val value: String = (parseJson \ "name" \ "tome").extract[String]
// 方法二:循环访问
val value: String = (parseJson \\ "tome").extract[String]

解析提取数组的json串

简单值数组

// 解析列表
parse(""" { "numbers" : [1, 2, 3, 4] } """)
res0: org.json4s.JsonAST.JValue =
JObject(List((numbers,JArray(List(JInt(), JInt(), JInt(), JInt()))))) // 程序解析
val listValue : List[BigInt] = for {JArray(child) <- jArray; JInt(value) <- child} yield value listValue.map(println)

嵌套数组json串解析

val json = parse(
"""
{ "name": "joe",
"children": [
{
"name": "Mary",
"age":
},
{
"name": "Mazy",
"age":
}
]
}
""") // 嵌套返回值
for (JArray(child) <- json) println(child)
res0: List(JObject(List((name,JString(Mary)), (age,JInt()))), JObject(List((name,JString(Mazy)), (age,JInt())))) // 嵌套取数组中某个字段值
for {
JObject(child) <- json
JField("age", JInt(age)) <- child
} yield age // 嵌套取数组中某个字段值,并添加过滤
for {
JObject(child) <- json
JField("name", JString(name)) <- child
JField("age", JInt(age)) <- child
if age >
} yield (name, age)

json和对象的转换

/** json转化为对象(不带外层字段) **/
case class ClassA(a: Int, b: Int) val json2: String = """[{"a":1,"b":2},{"a":1,"b":2}]""" val bb: List[ClassA] = parse(json2).extract[List[ClassA]] println(bb) /** json转对象(带外层字段名) */
case class ClassC(a: Int, b: Int) case class ClassB(c: List[ClassC]) val json3: String = """{"c":[{"a":1,"b":2},{"a":1,"b":2}]}""" val cc: ClassB = parse(json3).extract[ClassB] println(cc)

4、使用org.json4s产生json字符串

基本数据类型转化为普通json
1) 序列Seq转化为Json字符串

scala> val json = List(, , )

scala> compact(render(json))
res0: String = [,,]

2) Tuple2[String, A] 类型转化为json字符串

scala> val json = ("name" -> "joe")

scala> compact(render(json))
res1: String = {"name":"joe"}

3) ~ 合并object对象转化为json串

scala> val json = ("name" -> "joe") ~ ("age" -> )

scala> compact(render(json))
res2: String = {"name":"joe","age":}

4) option 类型转化为串

scala> val json = ("name" -> "joe") ~ ("age" -> Some())

scala> compact(render(json))
res3: String = {"name":"joe","age":} scala> val json = ("name" -> "joe") ~ ("age" -> (None: Option[Int])) scala> compact(render(json))
res4: String = {"name":"joe"}

5) case class 类转化为Json串

object JsonExample extends App {
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._ case class Winner(id: Long, numbers: List[Int])
case class Lotto(id: Long, winningNumbers: List[Int], winners: List[Winner], drawDate: Option[java.util.Date]) val winners = List(Winner(, List(, , , , , )), Winner(, List(, , , , , )))
val lotto = Lotto(, List(, , , , , , ), winners, None) val json =
("lotto" ->
("lotto-id" -> lotto.id) ~
("winning-numbers" -> lotto.winningNumbers) ~
("draw-date" -> lotto.drawDate.map(_.toString)) ~
("winners" ->
lotto.winners.map { w =>
(("winner-id" -> w.id) ~
("numbers" -> w.numbers))})) println(compact(render(json)))
}

5、使用org.json4s其他用法

1) 格式化json串

scala> pretty(render(JsonExample.json))

{
"lotto":{
"lotto-id":,
"winning-numbers":[,,,,,,],
"winners":[{
"winner-id":,
"numbers":[,,,,,]
},{
"winner-id":,
"numbers":[,,,,,]
}]
}
}

2) 合并两个json 串

scala> import org.json4s._
scala> import org.json4s.jackson.JsonMethods._ scala> val lotto1 = parse("""{
"lotto":{
"lotto-id":,
"winning-numbers":[,,,,,,],
"winners":[{
"winner-id":,
"numbers":[,,,,,]
}]
}
}""") scala> val lotto2 = parse("""{
"lotto":{
"winners":[{
"winner-id":,
"numbers":[,,,,,]
}]
}
}""") scala> val mergedLotto = lotto1 merge lotto2 scala> pretty(render(mergedLotto))
res0: String =
{
"lotto":{
"lotto-id":,
"winning-numbers":[,,,,,,],
"winners":[{
"winner-id":,
"numbers":[,,,,,]
},{
"winner-id":,
"numbers":[,,,,,]
}]
}
}

3) 两个json 串查找差异

scala> val Diff(changed, added, deleted) = mergedLotto diff lotto1
changed: org.json4s.JsonAST.JValue = JNothing
added: org.json4s.JsonAST.JValue = JNothing
deleted: org.json4s.JsonAST.JValue = JObject(List((lotto,JObject(List(JField(winners,
JArray(List(JObject(List((winner-id,JInt()), (numbers,JArray(
List(JInt(), JInt(), JInt(), JInt(), JInt(), JInt())))))))))))))

> 参考链接:https://blog.csdn.net/leehbing/article/details/74391308

scala解析json —— json4s 解析json方法汇总的更多相关文章

  1. Scala中使用fastJson 解析json字符串

    Scala中使用fastJson 解析json字符串 添加依赖 2.解析json字符 2.1可以通过JSON中的parseObject方法,把json字符转转换为一个JSONObject对象 2.2然 ...

  2. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  3. Ajax中解析Json的两种方法详解

    eval();  //此方法不推荐 JSON.parse();  //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name&qu ...

  4. 解析JSON的两种方法eval()和JSON.parse()

    解析JSON 一种方法是使用eval函数. var dataObj = eval("("+json+")"); 必须把文本包围在括号中,这样才能避免语法错误,迫 ...

  5. JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串;JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

    JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串:JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

  6. js 将json字符串转换为json对象的方法解析-转

    例如: JSON字符串:var str1 = '{ "name": "cxh", "sex": "man" }'; JS ...

  7. VBScript把json字符串解析成json对象的2个方法

    这篇文章主要介绍了VBScript把json字符串解析成json对象的2个方法,本文通过MSScriptControl.ScriptControl和jscript实现,需要的朋友可以参考下 asp/v ...

  8. Ajax中解析Json的两种方法

    eval(); //此方法不推荐 JSON.parse(); //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name" ...

  9. Golang解析json的几种方法

    Golang解析json的几种方法 概要 使用Golang调用其它平台API接口时总会被多层的json串给恶心到,我记录一下自己解析json的几种方法. 一.自带的json包 func JsonUnm ...

随机推荐

  1. Java解释器模式`

    解释器模式提供了一种评估计算语言语法或表达式的方法. 这种类型的模式属于行为模式. 这种模式涉及实现一个表达式接口,它告诉解释一个指定的上下文. 此模式用于SQL解析,符号处理引擎等. 实现示例 我们 ...

  2. void*和void类型

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. void的类型是无类型的数据,void*表示无类型的指针.其中void*可以指向任何数据类型的指针. void类型的用法: (1).voi ...

  3. qq传文件测试用例设计

  4. C#获取文件夹/文件的大小以及占用空间 转摘自:http://www.cnblogs.com/chenpeng-dota/articles/2176470.html

    C#获取文件夹/文件的大小以及占用空间 今天,头给了个任务:写个方法,我会给你个路径,计算这个路径所占用的磁盘空间 . 然后,找了很多资料.但大部分都是获取文件夹/文件的大小的.对于占用空间的没有成品 ...

  5. c# 微服务Ocelot网关服务发现

    前面提到微服务方案,介绍了该东西,推荐一篇介绍博文https://www.cnblogs.com/jesse2013/p/net-core-apigateway-ocelot-docs.html 我要 ...

  6. SQL数据库—<8>触发器

    触发器:一.什么是触发器?    一段SQL代码,挂到某个表的某个增.删.改的操作上.    当这个表执行相应的操作时,就会触发这段相应的SQL代码.触发器与存储过程的区别:1.存储过程是独立于表存在 ...

  7. WPF可视对象变换(RenderTransform)-----RotateTransform、TranslateTransform、ScaleTransform

    前言:对于可是元素,我们常见有三种变化,旋转.平移.面积 一.  旋转(RotateTransform) <RotateTransform CenterX="></Rota ...

  8. java两个数组内存图

  9. 转 关于HTML5中meta name="viewport" 的用法 不同分辨率手机比例缩放

    移动端的布局不同于pc端,首先我们要知道在移动端中,css中的1px并不等于物理上的1px,因为手机屏幕的分辨率已经越来越高,高像素但是屏幕尺寸却没有发生太大变化,那就意味着一个物理像素点实际上塞入了 ...

  10. select 1 from ... sql语句中的1解读

    摘自:http://blog.csdn.net/zengcong2013/article/details/48224509 select  1 from ..., sql语句中的1代表什么意思?查出来 ...