欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java開發(fā)工具-scala處理json格式利器-json4s詳解

 更新時(shí)間:2021年02月25日 16:04:20   作者:SuperFox  
這篇文章主要介紹了開發(fā)工具-scala處理json格式利器-json4s,文章中處理方法講解的很清楚,有需要的同學(xué)可以研究下

1.為什么是json4s

從json4s的官方描述

At this moment there are at least 6 json libraries for scala, not counting the java json libraries. All these libraries have a very similar AST. This project aims to provide a single AST to be used by other scala json libraries.
At this moment the approach taken to working with the AST has been taken from lift-json and the native package is in fact lift-json but outside of the lift project.

在scala庫中,至少有6個(gè)json庫,并且不包括 java的json庫,這些庫都有著類似的抽象語法樹AST,json4s的目的就是為了使用簡(jiǎn)單的一種語法支持這些json庫,因此說json4s可以說是一種json的規(guī)范處理,配合scala開發(fā)過程中極其簡(jiǎn)介的語法特性,可以輕松地實(shí)現(xiàn)比如json合并,json的diff操作,可以方便地處理jsonArray的字符串,所以如果使用scala,那么json4s一定不能錯(cuò)過,在實(shí)際場(chǎng)景下使用json處理數(shù)據(jù)很常見,比如spark開發(fā)中處理原始json數(shù)據(jù)等等,開始上手可能看起來比較復(fù)雜,但是用起來你會(huì)很爽。

2.json4s的數(shù)據(jù)結(jié)構(gòu)

json4s包括10個(gè)類型和一個(gè)type類型的對(duì)象,分別如下

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)

可以看到,他們都繼承自JValue,JValue是json4s里面類似于java的object地位,而JField是用來一次性匹配json的key,value對(duì)而準(zhǔn)備的。

3.json4s的實(shí)踐

下面來看,我們?nèi)绾蝸硎褂胘son4s

<dependency>
 <groupId>org.json4s</groupId>
 <artifactId>json4s-native_2.11</artifactId>
 <version>3.7.0-M6</version>
</dependency>

看下面的代碼即可,注釋寫的比較清晰,一般來說json的使用無外乎是字符串到對(duì)象或者對(duì)象到字符串,而字符串到對(duì)象可以用case class 也可以用原始的比如上面提到的類

package com.hoult.scala.json4s
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.native.JsonMethods._

object Demo1 {
 def main(args: Array[String]): Unit = {

 //parse方法表示從字符串到j(luò)son-object
 val person = parse(
  """
  |{"name":"Toy","price":35.35}
  |""".stripMargin, useBigDecimalForDouble = true)
 // 1.模式匹配提取, \表示提取
 val JString(name) = (person \ "name")
 println(name)

 // 2.extract[String]取值
// implicit val formats = org.json4s.Formats
 implicit val formats = DefaultFormats
 val name2 = (person \ "name").extract[String]
 val name3 = (person \ "name").extractOpt[String]
 val name4 = (person \ "name").extractOrElse("")

 // 3.多層嵌套取值
 val parseJson: JValue = parse(
  """
  |{"name":{"tome":"new"},"price":35.35}
  |""".stripMargin, useBigDecimalForDouble = true)

 //3.1 逐層訪問
 val value = (parseJson \ "name" \ "tome").extract[String]
 //3.2 循環(huán)訪問
 val value2 = (parseJson \\ "tome")
 println(value2)


 //4.嵌套json串解析
 val json = parse(
  """
   { "name": "joe",
   "children": [
    {
    "name": "Mary",
    "age": 20
    },
    {
    "name": "Mazy",
    "age": 10
    }
   ]
   }
  """)

// println(json \ "children")

 //模式匹配
 for (JArray(child) <- json) println(child)

 //提取object 下 某字段的值
 val ages = for {
  JObject(child) <- json
  JField("age", JInt(age)) <- child
 } yield age

 println(ages)

 // 嵌套取數(shù)組中某個(gè)字段值,并添加過濾
 val nameAges = for {
  JObject(child) <- json
  JField("name", JString(name)) <- child
  JField("age", JInt(age)) <- child
  if age > 10
 } yield (name, age)

 println(nameAges)

 // 5.json和對(duì)象的轉(zhuǎn)換,[就是json數(shù)組]
 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)

 // 6.json轉(zhuǎn)對(duì)象,[json 非json數(shù)組,但是每個(gè)級(jí)別要明確]
 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)

 // 7.使用org.json4s產(chǎn)生json字符串
// import org.json4s.JsonDSL._
 val json1 = List(1, 2, 3)
 val jsonMap = ("name" -> "joe")
 val jsonUnion = ("name" -> "joe") ~ ("age" -> 10)
 val jsonOpt = ("name" -> "joe") ~ ("age" -> Some(1))
 val jsonOpt2 = ("name" -> "joe") ~ ("age" -> (None: Option[Int]))
 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(10, List(1, 2, 5)), Winner(11, List(1, 2, 0)))
 val lotto = Lotto(11, List(1, 2, 5), winners, None)

 val jsonCase =
  ("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(json1)))
 println(compact(render(jsonMap)))
 println(compact(render(jsonUnion)))
 println(compact(render(jsonOpt)))
 println(compact(render(jsonOpt2)))
 println(compact(render(jsonCase)))

 // 8.json格式化
 println(pretty(render(jsonCase)))

 // 9.合并字符串
 val lotto1 = parse("""{
   "lotto":{
   "lotto-id": 1,
   "winning-numbers":[7,8,9],
   "winners":[{
    "winner-id": 1,
    "numbers":[7,8,9]
   }]
   }
  }""")

 val lotto2 = parse("""{
   "lotto":{
   "winners":[{
    "winner-id": 2,
    "numbers":[1,23,5]
   }]
   }
  }""")

 val mergedLotto = lotto1 merge lotto2
// println(pretty(render(mergedLotto)))

 // 10.字符串尋找差異
 val Diff(changed, added, deleted) = mergedLotto diff lotto1
 println(changed)
 println(added)
 println(deleted)

 val json10 = parse(
  """

  """)

 println("********8")
 println(json10)
 for (JObject(j) <- json10) println(j)

 println("********11")

 // 11.遍歷json,使用for
 // key1 values key1_vk1:v1 ....
 val str = "{\"tag_name\":\"t_transaction_again_day\",\"tag_distribute_json\":\"{\\\"1\\\":\\\"0.0011231395\\\",\\\"0\\\":\\\"0.9988768605\\\"}\"}"

 val valueJson = parse(str) \ "tag_distribute_json"
 println(valueJson)
 for {
  JString(obj) <- valueJson
  JObject(dlist) <- parse(obj)
  (key, JString(value))<- dlist
 } {
  println(key + "::" + value)
//  val kvList = for (JObject(key, value) <- parse(obj)) yield (key, value)
//  println("obj : " + kvList.mkString(","))
 }
 }
}

4.注意

4.1 compact 和 render的使用

常用寫法compact(render(json)),用來把一個(gè)json對(duì)象轉(zhuǎn)成字符串,并壓縮顯示,當(dāng)然也可以用prety(render(json))

4.2 序列化時(shí)候需要一個(gè)隱式對(duì)象

例如下面的

implicit val formats = Serialization.formats(NoTypeHints)

參考

https://json4s.org/

https://github.com/json4s/json4s/tree/v.3.2.0_scala2.10

https://www.cnblogs.com/yyy-blog/p/11819302.html

https://www.shuzhiduo.com/A/Vx5MBVOYdN/

https://segmentfault.com/a/1190000007302496

https://www.coder.work/article/6786418

https://www.wolai.com/sTVar6XXjpuM9ANFn2sx9n

https://www.wolai.com/sTVar6XXjpuM9ANFn2sx9n

到此這篇關(guān)于開發(fā)工具-scala處理json格式利器-json4s的文章就介紹到這了,更多相關(guān)scala處理json格式利器-json4s內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java-制表符\t的使用說明

    java-制表符\t的使用說明

    這篇文章主要介紹了java-制表符\t的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 教你如何在Intellij IDEA中集成Gitlab

    教你如何在Intellij IDEA中集成Gitlab

    今天來簡(jiǎn)單說下,如何在IDEA中集成gitlab項(xiàng)目,默認(rèn)情況下IDEA中的 VCS => Checkout From Version Control 選項(xiàng)中是沒有g(shù)itlab這一項(xiàng)的,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • SpringBoot使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)多機(jī)器部署問題(推薦)

    SpringBoot使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)多機(jī)器部署問題(推薦)

    這篇文章主要介紹了SpringBoot使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)多機(jī)器部署問題,定時(shí)任務(wù)多機(jī)器部署解決方案,方式一拆分,單獨(dú)拆分出來,單獨(dú)跑一個(gè)應(yīng)用,方式二是基于aop攔截處理(搶占執(zhí)行),只要有一個(gè)執(zhí)行,其它都不執(zhí)行,需要的朋友可以參考下
    2023-01-01
  • Java利用IO流實(shí)現(xiàn)簡(jiǎn)易的記事本功能

    Java利用IO流實(shí)現(xiàn)簡(jiǎn)易的記事本功能

    本文將利用Java中IO流編寫一個(gè)模擬日記本的程序,通過在控制臺(tái)輸入指令,實(shí)現(xiàn)在本地新建文件,打開日記本和修改日記本等功能,感興趣的可以了解一下
    2022-05-05
  • Mybatis超級(jí)強(qiáng)大的動(dòng)態(tài)SQL語句大全

    Mybatis超級(jí)強(qiáng)大的動(dòng)態(tài)SQL語句大全

    MyBatis的動(dòng)態(tài)SQL是基于OGNL表達(dá)式的,它可以幫助我們方便的在SQL語句中實(shí)現(xiàn)某些邏輯,下面這篇文章主要給大家介紹了關(guān)于Mybatis超級(jí)強(qiáng)大的動(dòng)態(tài)SQL語句的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Spring框架中部署log4j.xml的詳細(xì)步驟

    Spring框架中部署log4j.xml的詳細(xì)步驟

    Log4j是一個(gè)常用的日志記錄工具,它可以幫助我們記錄應(yīng)用程序的運(yùn)行日志并進(jìn)行靈活的配置,在Spring框架中,我們可以很方便地部署log4j.xml配置文件來管理日志記錄,這篇文章主要介紹了Spring框架中部署log4j.xml的詳細(xì)步驟并提供相應(yīng)的代碼示例,需要的朋友可以參考下
    2023-09-09
  • Mybatis結(jié)果生成鍵值對(duì)的實(shí)例代碼

    Mybatis結(jié)果生成鍵值對(duì)的實(shí)例代碼

    這篇文章主要介紹了Mybatis結(jié)果生成鍵值對(duì)的實(shí)例代碼,以及MyBatis返回Map鍵值對(duì)數(shù)據(jù)的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下
    2017-02-02
  • logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解

    logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解

    這篇文章主要為大家介紹了logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • JavaWeb?使用DBUtils實(shí)現(xiàn)增刪改查方式

    JavaWeb?使用DBUtils實(shí)現(xiàn)增刪改查方式

    這篇文章主要介紹了JavaWeb?使用DBUtils實(shí)現(xiàn)增刪改查方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • mybatis in查詢條件過長的解決方案

    mybatis in查詢條件過長的解決方案

    這篇文章主要介紹了mybatis in查詢條件過長的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論