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

1、org.json4s 引入pom的方法

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

  1. <dependency>
  2. <groupId>org.json4s</groupId>
  3. <artifactId>json4s-jackson_${scala.version}</artifactId>
  4. <version>{latestVersion}</version>
  5. </dependency>

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

  1. <dependency>
  2. <groupId>org.json4s</groupId>
  3. <artifactId>json4s-jackson_${scala.version}</artifactId>
  4. <version>{latestVersion}</version>
  5. </dependency>

2、Json4s 数据类型

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

  1. case object JNothing extends JValue // 'zero' for JValue
  2. case object JNull extends JValue
  3. case class JString(s: String) extends JValue
  4. case class JDouble(num: Double) extends JValue
  5. case class JDecimal(num: BigDecimal) extends JValue
  6. case class JInt(num: BigInt) extends JValue
  7. case class JLong(num: Long) extends JValue
  8. case class JBool(value: Boolean) extends JValue
  9. case class JObject(obj: List[JField]) extends JValue
  10. case class JArray(arr: List[JValue]) extends JValue
  11.  
  12. type JField = (String, JValue)

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

  1. def map(f: JValue => JValue): JValue
  2. def mapField(f: JField => JField): JValue
  3. def transform(f: PartialFunction[JValue, JValue]): JValue
  4. def transformField(f: PartialFunction[JField, JField]): JValue
  5. def find(p: JValue => Boolean): Option[JValue]
  6. def findField(p: JField => Boolean): Option[JField]

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

提取不嵌套的json串

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

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

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

2)多层嵌套套取单值

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

解析提取数组的json串

简单值数组

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

嵌套数组json串解析

  1. val json = parse(
  2. """
  3. { "name": "joe",
  4. "children": [
  5. {
  6. "name": "Mary",
  7. "age":
  8. },
  9. {
  10. "name": "Mazy",
  11. "age":
  12. }
  13. ]
  14. }
  15. """)
  16.  
  17. // 嵌套返回值
  18. for (JArray(child) <- json) println(child)
  19. res0: List(JObject(List((name,JString(Mary)), (age,JInt()))), JObject(List((name,JString(Mazy)), (age,JInt()))))
  20.  
  21. // 嵌套取数组中某个字段值
  22. for {
  23. JObject(child) <- json
  24. JField("age", JInt(age)) <- child
  25. } yield age
  26.  
  27. // 嵌套取数组中某个字段值,并添加过滤
  28. for {
  29. JObject(child) <- json
  30. JField("name", JString(name)) <- child
  31. JField("age", JInt(age)) <- child
  32. if age >
  33. } yield (name, age)

json和对象的转换

  1. /** json转化为对象(不带外层字段) **/
  2. case class ClassA(a: Int, b: Int)
  3.  
  4. val json2: String = """[{"a":1,"b":2},{"a":1,"b":2}]"""
  5.  
  6. val bb: List[ClassA] = parse(json2).extract[List[ClassA]]
  7.  
  8. println(bb)
  9.  
  10. /** json转对象(带外层字段名) */
  11. case class ClassC(a: Int, b: Int)
  12.  
  13. case class ClassB(c: List[ClassC])
  14.  
  15. val json3: String = """{"c":[{"a":1,"b":2},{"a":1,"b":2}]}"""
  16.  
  17. val cc: ClassB = parse(json3).extract[ClassB]
  18.  
  19. println(cc)

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

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

  1. scala> val json = List(, , )
  2.  
  3. scala> compact(render(json))
  4. res0: String = [,,]

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

  1. scala> val json = ("name" -> "joe")
  2.  
  3. scala> compact(render(json))
  4. res1: String = {"name":"joe"}

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

  1. scala> val json = ("name" -> "joe") ~ ("age" -> )
  2.  
  3. scala> compact(render(json))
  4. res2: String = {"name":"joe","age":}

4) option 类型转化为串

  1. scala> val json = ("name" -> "joe") ~ ("age" -> Some())
  2.  
  3. scala> compact(render(json))
  4. res3: String = {"name":"joe","age":}
  5.  
  6. scala> val json = ("name" -> "joe") ~ ("age" -> (None: Option[Int]))
  7.  
  8. scala> compact(render(json))
  9. res4: String = {"name":"joe"}

5) case class 类转化为Json串

  1. object JsonExample extends App {
  2. import org.json4s._
  3. import org.json4s.JsonDSL._
  4. import org.json4s.jackson.JsonMethods._
  5.  
  6. case class Winner(id: Long, numbers: List[Int])
  7. case class Lotto(id: Long, winningNumbers: List[Int], winners: List[Winner], drawDate: Option[java.util.Date])
  8.  
  9. val winners = List(Winner(, List(, , , , , )), Winner(, List(, , , , , )))
  10. val lotto = Lotto(, List(, , , , , , ), winners, None)
  11.  
  12. val json =
  13. ("lotto" ->
  14. ("lotto-id" -> lotto.id) ~
  15. ("winning-numbers" -> lotto.winningNumbers) ~
  16. ("draw-date" -> lotto.drawDate.map(_.toString)) ~
  17. ("winners" ->
  18. lotto.winners.map { w =>
  19. (("winner-id" -> w.id) ~
  20. ("numbers" -> w.numbers))}))
  21.  
  22. println(compact(render(json)))
  23. }

5、使用org.json4s其他用法

1) 格式化json串

  1. scala> pretty(render(JsonExample.json))
  2.  
  3. {
  4. "lotto":{
  5. "lotto-id":,
  6. "winning-numbers":[,,,,,,],
  7. "winners":[{
  8. "winner-id":,
  9. "numbers":[,,,,,]
  10. },{
  11. "winner-id":,
  12. "numbers":[,,,,,]
  13. }]
  14. }
  15. }

2) 合并两个json 串

  1. scala> import org.json4s._
  2. scala> import org.json4s.jackson.JsonMethods._
  3.  
  4. scala> val lotto1 = parse("""{
  5. "lotto":{
  6. "lotto-id":,
  7. "winning-numbers":[,,,,,,],
  8. "winners":[{
  9. "winner-id":,
  10. "numbers":[,,,,,]
  11. }]
  12. }
  13. }""")
  14.  
  15. scala> val lotto2 = parse("""{
  16. "lotto":{
  17. "winners":[{
  18. "winner-id":,
  19. "numbers":[,,,,,]
  20. }]
  21. }
  22. }""")
  23.  
  24. scala> val mergedLotto = lotto1 merge lotto2
  25.  
  26. scala> pretty(render(mergedLotto))
  27. res0: String =
  28. {
  29. "lotto":{
  30. "lotto-id":,
  31. "winning-numbers":[,,,,,,],
  32. "winners":[{
  33. "winner-id":,
  34. "numbers":[,,,,,]
  35. },{
  36. "winner-id":,
  37. "numbers":[,,,,,]
  38. }]
  39. }
  40. }

3) 两个json 串查找差异

  1. scala> val Diff(changed, added, deleted) = mergedLotto diff lotto1
  2. changed: org.json4s.JsonAST.JValue = JNothing
  3. added: org.json4s.JsonAST.JValue = JNothing
  4. deleted: org.json4s.JsonAST.JValue = JObject(List((lotto,JObject(List(JField(winners,
  5. JArray(List(JObject(List((winner-id,JInt()), (numbers,JArray(
  6. 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. FastReport.net 使用 WebForm 实现打印 最简单版

    1.安装demo 2.设计模版 设计器 -->report-->添加数据源-->添加sql查询->起名字(车信息)下一步-->填写sql语句(select top 1 * ...

  2. docker镜像仓库

    搭建私有镜像仓库 Docker Hub作为Docker默认官方公共镜像,如果想自己搭建私有镜像仓库,官方也提供registry镜像,使得搭建私有仓库非常简单. 下载registry镜像并启动 [roo ...

  3. python 多进程队列数据处理

    # -*- coding:utf8 -*- import paho.mqtt.client as mqtt from multiprocessing import Process, Queue imp ...

  4. shell unique

    由于uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文本行进行排序,使重复行集中到一起 1.文本行去重 (1)排序由于uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文 ...

  5. Spring IOC 的理解,初始化过程

    在创建ApplicationContext实例对象过程中会创建一个spring容器,该容器会读取配置文件"cn/wuliaokankan/beans.xml",并统一管理由该文件中 ...

  6. 转帖 java使用poi.3.10读取excel 2010

    package poi; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; ...

  7. k8s-mysql搭建

    安装官方文档https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/ 搭建完成,但是没 ...

  8. 执行cython文件

    找到目录下的setup.py文件 cd到工程目录下: 执行 python3 setup.py build_ext --inplace

  9. Jquery中的offset()和position()深入剖析(元素定位)

    先看看这两个方法的定义. offset(): 获取匹配元素在当前视口的相对偏移. 返回的对象包含两个整形属性:top 和 left.此方法只对可见元素有效. position(): 获取匹配元素相对父 ...

  10. BZOJ 2839: 集合计数(二项式反演)

    传送门 解题思路 设\(f(k)\)为交集元素个数为\(k\)的方案数.发现我们并不能直接求出\(f(k)\),就考虑容斥之类的东西,容斥首先要扩大限制,再设\(g(k)\)表示至少有\(k\)个交集 ...