我有一个函数,它将对象列表作为参数,从列表中取出每个对象,并使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
}
}
我需要在不同的类中使用这个函数和列表的不同参数类型,即列表[教师],列表[管理员]等
有没有办法编写这个函数,以便我可以将它用于不同的类,或者我必须为每个类单独编写它?
如果不可能, 我有一个用户特征和一些扩展用户特征的类。我能否以可供所有子类使用的方式编写上述代码
答案 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序列化程序(例如Student
或Admin
)
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