一、背景

  处理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() 来解析成原有的数据类型,否则会报错。

最新文章

  1. 让BI告诉你:圣诞老人去哪了?
  2. Oracle创建表空间及用户
  3. GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件
  4. javaScript 1
  5. JAVA_BaseDAO数据处理类
  6. Lua和C语言的交互——C API
  7. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.4.性能
  8. 目标跟踪之Lukas-Kanade光流法
  9. Area - POJ 1265(pick定理求格点数+求多边形面积)
  10. android_handler(三)
  11. PHP - 类库
  12. java中HashSet详解
  13. 三种不同实现初始化和销毁bean之前进行的操作的比较
  14. CSS - DOM 经常使用方法
  15. 关于期权池Option Pools与Vesting:码农创业防身必备法器
  16. NOIP2011Mayan游戏(模拟)
  17. redis 一些操作命令
  18. electron 使用 node-ffi 调用 C++ 动态链接库(DLL)
  19. Oracle PLSQL Demo - 15.强类型REF游标[预先指定查询类型与返回类型]
  20. (转)fiddler模拟post请求

热门文章

  1. JavaScript设计模式 Item9 --适配器模式Adapter
  2. C++成员对齐方式探讨
  3. UVa 11475 - Extend to Palindrome
  4. Angular常用标记
  5. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
  6. 3736 【HR】万花丛中2
  7. bzoj 1601 灌水
  8. 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring
  9. oracle 分页方法
  10. PCB CE工具取Genesis JOB与STEP内存地址 方法分享