小白学习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() 来解析成原有的数据类型,否则会报错。
小白学习Spark系列五:scala解析多级json格式字符串的更多相关文章
- 小白学习Spark系列四:RDD踩坑总结(scala+spark2.1 sql常用方法)
初次尝试用 Spark+scala 完成项目的重构,由于两者之前都没接触过,所以边学边用的过程大多艰难.首先面临的是如何快速上手,然后是代码调优.性能调优.本章主要记录自己在项目中遇到的问题以及解决方 ...
- 小白学习Spark系列三:RDD常用方法总结
上一节简单介绍了Spark的基本原理以及如何调用spark进行打包一个独立应用,那么这节我们来学习下在spark中如何编程,同样先抛出以下几个问题. Spark支持的数据集,如何理解? Spark编程 ...
- 小白学习Spark系列一:Spark简介
由于最近在工作中刚接触到scala和Spark,并且作为python中毒者,爬行过程很是艰难,所以这一系列分为几个部分记录下学习<Spark快速大数据分析>的知识点以及自己在工程中遇到的小 ...
- 小白学习Spark系列二:spark应用打包傻瓜式教程(IntelliJ+maven 和 pycharm+jar)
在做spark项目时,我们常常面临如何在本地将其打包,上传至装有spark服务器上运行的问题.下面是我在项目中尝试的两种方案,也踩了不少坑,两者相比,方案一比较简单,本博客提供的jar包适用于spar ...
- 小白学习Spark系列六:Spark调参优化
前几节介绍了下常用的函数和常踩的坑以及如何打包程序,现在来说下如何调参优化.当我们开发完一个项目,测试完成后,就要提交到服务器上运行,但运行不稳定,老是抛出如下异常,这就很纳闷了呀,明明测试上没问题, ...
- JSON(五)——同步请求中使用JSON格式字符串进行交互(不太常见的用法)
在同步请求中使用JSON格式进行数据交互的场景并不多,同步请求是浏览器直接与服务器进行数据交互的大多是用jsp的标签jstl和el表达式对请求中的数据进行数据的渲染.我也是在一次开发中要从其它服务器提 ...
- 关于json格式字符串解析并用mybatis存入数据库
园子里面找了很多关于json解析后存入数据库的方法,不是太乱,就是没有写完,我下面的主题代码多是受下面两位的启发,请按顺序查看 http://www.cnblogs.com/tian830937/p/ ...
- 逐层解析请求json参数字符串【我】
import net.sf.json.JSONObject; 逐层解析请求json参数字符串: InputStream inStream =null; BufferedReader br =null; ...
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- linux中man手冊的高级使用方法
Linux提供了丰富的帮助手冊.当你须要查看某个命令的參数时不必到处上网查找.仅仅要man一下就可以. Linux 的man手冊共同拥有下面几个章节: 1.Standard commands (标准命 ...
- 《Java设计模式》之解释器模式
解释器模式是类的行为模式.给定一个语言之后,解释器模式能够定义出其文法的一种表示,并同一时候提供一个解释器. client能够使用这个解释器来解释这个语言中的句子. 解释器模式的结构 以下就以一个示意 ...
- android混合动画实现
在android开发,我们会常常使用到动画,可是简单的一种动画(如旋转.缩放.渐变.位移等)有时候并不能满足我们项目的要求,这时候就须要运用到混合动画.那么在安卓中是怎样实现一个炫酷的混合动画,以下是 ...
- Ubuntu 13.10 安装 TeX Live 2013
注:笔者也是刚刚接触TeX系统,水平有限,若有疏漏之处还望指正. 中文解决方案 对于LaTeX中文排版,比较方便有这样的几种解决方案:LaTeX+CJK / LaTeX+XeTeX / CTeX.其中 ...
- audio_device模块分析
1. 对外接口 AudioDeviceModule, 採音放音接口,音量控制,静音控制等 2. 主要类 AudioDeviceModuleImpl, 对外提供的主要实现 ...
- checkbox是否选中判断
三种方式: $('#checkAll').bind('click',function(){ //第一种 console.log(this.checked); //第二种 console.log($(t ...
- 第三周 Leetcode 4. Median of Two Sorted Arrays (HARD)
4. Median of Two Sorted Arrays 给定两个有序的整数序列.求中位数,要求复杂度为对数级别. 通常的思路,我们二分搜索中位数,对某个序列里的某个数 我们可以在对数时间内通过二 ...
- MSP430 PIN 操作寄存器
1.P口端口寄存器: (1).PxDIR 输入/输出方向寄存器 (0:输入模式 1:输出模式) (2).PxIN 输入寄存器 输入寄存器是只读寄存器,用户不能对其写入,只能通过读取该寄 ...
- 创建APP检查更新页
本文来源及参考:Create a check for updates page for your app. 这篇文章解释了如何创建一个简单的检查更新页,检查该用户已安装的应用程序的最新版本. 简介 这 ...
- Rails 服务器架设失败问题
更新: 2017/09/14 补充了简单的确认号码的方法 A server is already running. Check /Users/...../pids/server.pid. Exitin ...