scala-json

scala 自带json模块

import scala.util.parsing.json
不用第三方包, 解析和拼接都不好控制

# map -> scala.util.parsing.json.JSONObject
scala.util.parsing.json.JSONObject(map).toString()
# list -> scala.util.parsing.json.JSONArray
scala.util.parsing.json.JSONArray(list).toString()
# json -> map
import scala.util.parsing.json.JSON
import scala.util.parsing.json.JSONObject

val colors:Map[String,Object]  = Map("red" -> "123456", "azure" -> "789789")  
val json = JSONObject(colors)  
println(json)  
val jsonMap = JSON.parseFull(json.toString).get.asInstanceOf[Map[String,Object]]  
println(jsonMap)  
/* ---------------------------------------- */
val jsonStr = """{"username":"Ricky", "age":"21"}"""
val jsonValue = JSON.parseFull(jsonStr)
val jsonObj = jsonValue match {
    case Some(map:Map[String, Any]) => map.asInstanceOf[Map[String,String]]
    case _ => println("ERROR jsonStr")
}
val username = jsonObj.get("username")

import scala.util.parsing.json.JSON

val jsonStr = """{"username":"Ricky", "attribute":{"age":21, "weight": 60}}"""
val jsonValue = JSON.parseFull(jsonStr)

val jsonObj = jsonValue match {
    case Some(map:Map[String, Any]) => map
    case other => println("Error jsonStr")
}

// 将attribute转换成Map
val attrObj = jsonObj.get("attribute").get.asInstanceOf[Map[String, String]]

val age = attrObj.get("age")

json4s

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

官网地址: https://github.com/json4s/json4s
生成和解析json的过程都有些麻烦, 不能直接生成一个map或list
JObject解析, 但json和xml格式可以互转

# json -> List
import org.json4s._
import org.json4s.jackson.JsonMethods._

var temp = new ListBuffer[(String, Long, Int)]
val dataLog = parse(x.toString)
              for {JObject(child) <- dataLog
                   JField("url", JString(url)) <- child
                   JField("time", JInt(time)) <- child
                  JField("origin", JInt(origin)) <- child
                if origin.toDouble.toInt >= 1
              } 
temp += Tuple4(url,
                           time.toDouble.toLong,    
                            origin.toString.toDouble.toInt)

样例类解析

scala> import org.json4s._
scala> import org.json4s.jackson.JsonMethods._

scala> implicit val formats = DefaultFormats // Brings in default date formats etc.

scala> case class Child(name: String, age: Int, birthdate: Option[java.util.Date])
scala> case class Address(street: String, city: String)
scala> case class Person(name: String, address: Address, children: List[Child])

scala> val json = parse("""
         { "name": "joe",
           "address": {
             "street": "Bulevard",
             "city": "Helsinki"
           },
           "children": [
             {
               "name": "Mary",
               "age": 5,
               "birthdate": "2004-09-04T18:06:22Z"
             },
             {
               "name": "Mazy",
               "age": 3
             }
           ]
         }
       """)

scala> json.extract[Person]
res0: Person = Person(joe,Address(Bulevard,Helsinki),List(Child(Mary,5,Some(Sat Sep 04 18:06:22 EEST 2004)), Child(Mazy,3,None)))

scala> val addressJson = json  \ "address"  // Extract address object
scala> addressJson.extract[Address]
res1: Address = Address(Bulevard,Helsinki)

scala> (json \ "children").extract[List[Child]]  // Extract list of objects
res2: List[Child] = List(Child(Mary,5,Some(Sat Sep 04 23:36:22 IST 2004)), Child(Mazy,3,None))

json拼接

# map -> 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(23, List(2, 45, 34, 23, 3, 5)), Winner(54, List(52, 3, 12, 11, 18, 22)))
  val lotto = Lotto(5, List(2, 45, 34, 23, 7, 5, 3), 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)))
}
scala> JsonExample
{"lotto":{"lotto-id":5,"winning-numbers":[2,45,34,23,7,5,3],"winners":
[{"winner-id":23,"numbers":[2,45,34,23,3,5]},{"winner-id":54,"numbers":[52,3,12,11,18,22]}]}}

gson

https://blog.csdn.net/shuaidan19920412/article/details/79356440

json <-> case class

import com.google.gson.Gson
case class Student( name:String , no: String )  
  val gson = new Gson  
    val student = Student("张三", "100")  
    val str = gson.toJson(student, classOf[Student])  
    println(str)  
    val student2 = gson.fromJson(str, classOf[Student])  
    println(student2)  

json <-> javaMap

// 注意这里只能是java的HashMap 或者其子类LinkedHashMap, TreeMap
// 经实验 scala的Map 以及 java.util.Map 都会有问题的
val map = new java.util.HashMap[String, Object]()  
map.put("abc", List(s1,s2).toArray)  
val gson = new Gson()  
println( gson.toJson(map) )
判断json
def isGoodJson(json: String):Boolean = {  
  
   if(null == json) {  
     return false  
   }  
   val result =  JSON.parseFull(json) match {  
     case Some(_:  Map[String, Any]) => true  
     case None => false  
     case _ => false  
   }  
   result  
 } 

spray-json

https://github.com/spray/spray-json

<dependency>
      <groupId>io.spray</groupId>
      <artifactId>spray-json_${scala.version}</artifactId>
      <version>1.3.2</version>
</dependency>
val json = JsonParser(result).asJsObject()
println(json.getFields("name"))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容