小白學習Spark系列五:scala解析多級json格式字符串


 一、背景

  處理json格式的字符串,key值一定為String類型,但value不確定是什么類型,也可能嵌套json字符串,以下是使用 JSON.parseFull 來解析多層json。

二、實例代碼

import collection.mutable.Map
import scala.util.parsing.json._
def regJson(json:Option[Any]) = json match {
      //轉換類型
      case Some(map:collection.immutable.Map[String, Any]) => map
}

def str_json(string_json:String):collection.immutable.Map[String,Any]=
{
    var first :collection.immutable.Map[String, Any] = collection.immutable.Map()
    val jsonS = JSON.parseFull(string_json)
    //不確定數據的類型時,此處加異常判斷
    if (jsonS.isInstanceOf[Option[Any]]){
        first = regJson(jsonS)
    }
    first
    }
val jsonStr = """{"id":"1", "name":"jack","detail_info":{"age":"18","sex":"man"}}"""
val parse_str = str_json(jsonStr)
//parse_str: scala.collection.immutable.Map[String,Any] = Map(id -> 1, name -> jack, detail_info -> Map(age -> 18, sex -> man))
val id = parse_str("id")
//res7: Any = 1,此處為Any類型,一定要在使用前轉換為原有類型,可以用asInstanceOf函數
val id_str = parse_str("id").toString
//res8: String = 1
val detail_info = parse_str("detail_info")
//res9: Any = Map(age -> 18, sex -> man)
//val parse_str("detail_info").asInstanceOf[Map[String, String]]
//提示錯誤:java.lang.ClassCastException: scala.collection.immutable.Map$Map2 cannot be cast to scala.collection.mutable.Map。注意Map類型
val parse_detail = parse_str("detail_info").asInstanceOf[scala.collection.immutable.Map[String,Any]]
//parse_detail: scala.collection.immutable.Map[String,Any] = Map(age -> 18, sex -> man)
val sex_str = parse_detail("sex").toString
//res14: String = man
val parse_detail = parse_str("detail_info").asInstanceOf[scala.collection.immutable.Map[String,Any]]

 三、分析

  以上代碼中,需要注意的兩點是(1)類型轉換時,默認的Map為 scala.collection.immutable.Map,由於第一行聲明了可變Map類型,所在在后期 asInstanceOf ()嵌套的json格式字符串時,需要顯示聲明不可變map類型。(2)由於不確定json字符串的值類型,需要使用Any類型預定義,在具體解析某個字段時,必須用 asInstanceOf() 來解析成原有的數據類型,否則會報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM