0%

Scala杂记

本文主要包括:

  • 使用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 + ba.+(b)的简写
a 方法 b可以写成 a.方法(b)

Scala 方法和函数的区别

可以参考Scala 方法与函数
Scala 方法与函数,二者在语义上的区别很小,Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
Scala 中使用val语句可以定义函数,def语句定义方法。