Scala Learning(1): 使用Pattern Matching表達JSON

這是一個挺能展現Scala編程方式的例子,對正在熟悉Scala這門語言的開發者很有幫助。

Representing JSON

用Scala來表達JSON(Java Script Object Notation)結構,

{
  "firstname" : "John",
  "lastname" : "Smith",
  "address" : {
    "street" : "21 2nd Street",
    "state" : "NY",
    "postalCode" : 10021
  },
  "phoneNumbers" : [
    { "type" : "home", "number" : "212 555-1234" },
    { "type" : "fax", "number : "646 555-4567" }
  ] 
}

Scala表示JSON的一種類結構:

abstract class JSON
case class JSeq (elems: List[JSON]) extends JSON
case class JObj (bindings: Map[String, JSON]) extends JSON
case class JNum (num: Double) extends JSON
case class JStr (str: String) extends JSON
case class JBool(b: Boolean) extends JSON
case object JNull extends JSON

Example

val data = JObj(Map(
  "firstName" -> JStr("John"),
  "lastName" -> JStr("Smith"),
  "address" -> JObj(Map(
    "street" -> JStr("21 2nd Street"),
    "state" -> JStr("NY"),
    "postalCode" -> JNum(10021)
  )),
  "phoneNumbers" -> JSeq(List(
    JObj(Map(
      "type" -> JStr("home"), "number" -> JStr("212 555-1234")
    )),
    JObj(Map(
      "type" -> JStr("fax"), "number"-> JStr("646 555-4567")
    )) 
  ))
))

利用Pattern Matching,展示一個輸出JSON string串的方法:

def show(json: JSON): String = json match {
  case JSeq(elems) =>
    "[" + (elems map show mkString ", ") + "]"
  case JObj(bindings) =>
    val assocs = bindings map {
      case (key, value) => "\"" + key + "\": " + show(value)
    }
  "{" + (assocs mkString ", ") + "}"
  case JNum(num) => num.toString
  case JStr(str) => '\"' + str + '\"'
  case JBool(b) => b.toString
  case JNull => "null"
}

參考自 Principles of Reactive Programming

全文完 :)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章