scala中json与对象的转换
- 遇到的问题
因为要把spark从es读出来的json数据转换为对象,开始想用case class定义类型,通过fastjson做转换。如下
case class Book (author: String, content: String, id: String, time: Long, title: String) val json = "{\"author\":\"hll\",\"content\":\"ES即etamsports\",\"id\":\"693\",\"time\":1490165237200,\"title\":\"百度百科\"}"
val mapper: ObjectMapper = new ObjectMapper()
val book: Book = mapper.readValue(json, classOf[Book])
结果抛出了异常:com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class JsonTest$Book]
换成fastjson也会有相似的异常。
恍然大悟,case class没有空参构造函数,跟fastjson这些库不太兼容。
- 解决办法
然而又不想就java class,然后就找到了json4s-jackson,可以完美兼容scala的case class。
pom依赖:
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_2.10</artifactId>
<version>3.2.10</version>
</dependency>
使用的样例代码:
//隐式转换必须要导入
import org.json4s._
import org.json4s.jackson.JsonMethods._ class Book(val author: String,val content: String,val id: String, val time: Long, val title: String) object JsonTest { def main(args: Array[String]) {
val json = "{\"author\":\"hll\",\"content\":\"ES即etamsports\",\"id\":\"693\",\"time\":1490165237200,\"title\":\"百度百科\"}"
//导入隐式值
implicit val formats = DefaultFormats
val book: Book = parse(json).extract[Book]
println(book.content)
} }
- 实际使用与思考
spark程序中的应用:
1
2
|
implicit val formats = DefaultFormats esRDD.map(_._2).map(parse(_).extract[Book]).sortBy(_.time, false).take(10).foreach(println) |
spark里面解析json数据有一个经典的问题,ObjectMapper对象的创建很重。一般使用mapPartition来对一个分区复用ObjectMapper对象。
我们来看一下parse方法的源码:
private[this] lazy val _defaultMapper = {
val m = new ObjectMapper()
m.registerModule(new Json4sScalaModule)
m
}
def mapper = _defaultMapper def parse(in: JsonInput, useBigDecimalForDouble: Boolean = false): JValue = {
mapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, useBigDecimalForDouble)
in match {
case StringInput(s) => mapper.readValue(s, classOf[JValue])
case ReaderInput(rdr) => mapper.readValue(rdr, classOf[JValue])
case StreamInput(stream) => mapper.readValue(stream, classOf[JValue])
case FileInput(file) => mapper.readValue(file, classOf[JValue])
}
}
实际使用的ObjectMapper对象是lazy初始化的而且是复用的,避免了ObjectMapper对象的重复创建,很nice。
scala中json与对象的转换的更多相关文章
- js与json的区别,json的概述,json与面向对象,json与对象的转换
<script> //js与json的区别,json的概述,json与面向对象,json与对象的转换 //json的概述:json(javascript object Notation,j ...
- JSON转换类(二)--List转换成Json、对象集合转换Json等
#region List转换成Json /// <summary> /// List转换成Json /// </summary> public static string Li ...
- List转换成Json、对象集合转换Json等
#region List转换成Json /// <summary> /// List转换成Json /// </summary> public static string Li ...
- json 和对象互相转换
json 和对象互相转换 导入 Jar 包: import com.fasterxml.jackson.databind.ObjectMapper; Maven 地址: <!-- https:/ ...
- python接口自动化:响应内容中json字符串对象的处理
实现代码如下: import json #定义一个字典.一个列表.两个字符串({}中必须是双引号) di1={"} di2=[{"}] di3='{"name" ...
- EF中Json序列化对象时检测到循环引用的解决办法
MVC4 EF中将数据表外键引用的是自身,转换成Json时,总是提示错误:“序列化类型为....的对象时检测到循环引用.”: 解决办法: 把要序列化的对象转为匿名对象去掉导航属性,如下 :本来是var ...
- python中json与dict之间转换
Python之dict(或对象)与json之间的互相转化 在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import js ...
- python 中json和字符串互相转换
string =" { "status": "error", "messages": ["Could not f ...
- Python 中 JSON和dict的转换,json的使用
一. 基础语法 在Python 的 json库中,共有四个方法.分别是: json.load() # 从文件中加载 json.loads() # 数据中加载 json.dump() # 转存到文件 j ...
随机推荐
- “Info.plist” couldn’t be removed
Showing All Messages error: failed to remove /Users/Rubert/Library/Developer/Xcode/DerivedData/Proje ...
- Oracle列自增实现(3)-DEFAULT Values Using Sequences
Oracle 12c中,可以使用序列的NEXTVAL and CURRVAL的值作为默认值,来实现列自增! 一.使用序列的NEXTVAL and CURRVAL的值作为默认值 创建序列 CREATE ...
- 对2个hex(16进制)字符串进行异或操作
private static String hexXOR(String hex1, String hex2){ BigInteger i1 = new BigInteger(hex1, 16); Bi ...
- 一次dns缓存引发的慘案
时间2015年的某个周六凌晨5点,公司官方的QQ群实用户反馈官网打不开了,但有的用户反馈能够打开.客服爬起来自己用电脑试了一下没有问题,就给客户反馈说.可能是自己网络的问题,请过会在试试.早点8点,越 ...
- 转 linux下面apache2.0.52+php5+gd2+mysql
gd2才开始支持真彩图片的创建,所以,,升级服务器,因为原来的安装都是默认的系统安装,也更因为是个菜鸟,所以,安装很困难,起初根据网上一些文章在我的red hat A 3 上安装测试,不过,测试了安装 ...
- jenkins 搭建过程中遇到的问题
1.[ERROR] Unknown lifecycle phase "mvn". You must specify a valid lifecycle phase or a goa ...
- Oracle死锁导致的tomcat抛损坏的管道异常
今天遇到个问题,就是由于清空数据库的数据,设备采集客户端一直在往服务器上发采集回来的数据,但是由于某种原因,数据库的某语句死锁了. 数据库的死锁语句是通过这个SQL查出来的:select sql_te ...
- yum安装nodejs 8
Install Node.js 8 on Enterprise Linux Distributions To install Node.js 8 on Enterprise Linux distros ...
- NYOJ----蛇形填数
蛇形填数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 ...
- 【备份】使用mysqldump 实现rename database name(mysql数据库改名称)
需求:将jxl_credit改名为jxl_test;输入:jxl_credit输出: jxl_test; 实现方式:1).新建jxl_test,2).备份jxl_credit到本地,3).然后将备份数 ...