本文主要包括:
- 使用Scala解析Json
解析json
个人认为,解析json用的最多的就是fastjson了
使用前需要在pom文件中引用:
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
<scope>compile</scope>
代码案例:
val jsonStr =
"""
|[
| {
| "type_name" : "aa",
| "score" : 0.9995,
| "classcode" : "a1:0.2136;a2:0.2136;a3:0.2136;a4:0.1582;a5:0.1578;a6:0.0429;a7:0.0004"
| },
| {
| "type_name" : "bb",
| "score" : 0.0005,
| "classcode" : "b1:0.5000;b2:0.5000"
| }
| ]
|""".stripMargin
val typeTageArr = mutable.ArrayBuffer[Map[String,String]]()
if (!"".equals(jsonStr) && !"[]".equals(jsonStr)) {
val jsonArr = JSON.parseArray(jsonStr)
val houses = (0 until jsonArr.size()).map(jsonArr.getJSONObject).toArray
for(jsMap <- houses){
val typeName = jsMap.get("type_name").toString
val classCode = jsMap.get("classcode").toString.split(";").map(x => x.split(":")(0)).mkString(",")
typeTageArr += Map("type" -> typeName,"classTags" -> classCode)
}
}
array转json
一开始使用JSON.toJSONString(typeTageArr)这种方式,但是报如下错
error: ambiguous reference to overloaded definition,
both method toJSONString in object JSON of type (x$1: Any, x$2: com.alibaba.fastjson.serializer.SerializerFeature*)String
and method toJSONString in object JSON of type (x$1: Any)String
从报错的信息当中我们得知是scala对对重载定义的模糊引用造成,从fastjson的源码中可以看到,有两个toJSONString的方法:
public static String toJSONString(Object object) {
return toJSONString(object, emptyFilters);
}
public static String toJSONString(Object object, SerializerFeature... features) {
return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
}
在第二个方法中SerializerFeature… features 是一个可变长参数,带有变长参数的方法重载使得scala在调用方法时感到“模糊”,就无法匹配参数的类型
所以在array或者map转json对象的时候,使用json4s比较好
使用案例:
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
compact(render(typeTageArr))
使用起来很方便
Scala中调用方法和函数
Scala中的+ - * / %等操作符的作用与Java一样,位操作符 & | ^ >> <<也一样。只是有一点特别的:这些操作符实际上是方法。例如:a + b
是a.+(b)
的简写a 方法 b
可以写成 a.方法(b)
Scala 方法和函数的区别
可以参考Scala 方法与函数
Scala 方法与函数,二者在语义上的区别很小,Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
Scala 中使用val
语句可以定义函数,def
语句定义方法。