如何在Scala

时间:2015-06-10 12:41:36

标签: scala

我有一个函数,它将对象列表作为参数,从列表中取出每个对象,并使json对象具有其属性,然后将json对象添加到可变列表并返回它

class foo {
  var jsonlist = new MutableList[JsValue]

  def makeJson(objlist : List[Student]) : MutableList[JsValue] = {

     for( obj <- objlist){
      var jsobj = Json.obj("name" -> obj.getName, "uuid" -> obj.getUuid)
      jsonlist += jsobj
    }
    jsonlist
  }

}

我需要在不同的类中使用这个函数和列表的不同参数类型,即列表[教师],列表[管理员]等

有没有办法编写这个函数,以便我可以将它用于不同的类,或者我必须为每个类单独编写它?

如果不可能,  我有一个用户特征和一些扩展用户特征的类。我能否以可供所有子类使用的方式编写上述代码

3 个答案:

答案 0 :(得分:2)

假设您有以下

abstract class User {
  def id: UUID
  def name: String
}

case class Student(id: UUID, name: String, classRoom: String) extends User

然后你可以写这样的东西

  var jsonList = new mutable.MutableList[JsValue]

  def makeJson[T <: User](objList: List[T]): mutable.MutableList[JsValue] = {
    objList.foreach(obj => jsonList += Json.obj("uuid" -> obj.id, "name" -> obj.name))
    jsonList
  }

答案 1 :(得分:2)

您也可以使用类型类。这样您就可以为希望能够序列化的每个类提供特定的JSON序列化程序(例如StudentAdmin

trait JsonSerializer[T] {
  def toJson(x:T):JsValue
}

def toJson[T:JsonSerializer](xs:List[T]) = {
  val serializer = implicitly[JsonSerializer[T]]
  for (x <- xs) yield serializer.toJson(x)
}

implicit object StudentJsonSerializer extends JsonSerializer[Student] {
   // here you implement the serialization of the student
}

同样,您可以为Admin或任何您想要的内容提供实现。

答案 2 :(得分:1)

使用父类或特征

class Foo {
  var jsonlist = new mutable.MutableList[JsValue]

  def makeJson(objlist : List[Jsonable]) : mutable.MutableList[JsValue] = {

    for( obj <- objlist){
      var jsobj = Json.obj("name" -> obj.getName, "uuid" -> obj.getUuid)
      jsonlist += jsobj
    }
    jsonlist
  }

}


trait Jsonable {
  protected val name: String
  protected val uuid: Long
  def getName = name
  def getUuid = uuid
}

case class Student(name: String, uuid: Long) extends Jsonable
case class Teacher(name: String, uuid: Long) extends Jsonable