2015-06-10 1 views
2

У меня есть функция, которая принимает список объектов в качестве параметра, вынимает каждый объект из списка и делает объект json с его атрибутами, а затем добавляет json-объект в изменяемый список и возвращает егоКак сделать параметр функции более общим в Scala

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 
    } 

} 

мне нужна эта fucntion в различных классах с и другой тип параметра для списка т.е. List [Учителя] Список [Администратор] и т.д.

есть ли способ написания этой функции так что я могу использовать его для разных классов, или я должен писать его отдельно для каждого класса?

, если это невозможно, У меня есть пользовательская черта и некоторые классы, которые расширяют пользовательскую черту. Могу ли я написать код выше в пути, который может быть использован всеми дочерними классами

+0

Вам нужно сделать объект JSON из этих двух полей или из разных полей в каждом классе? –

+0

@SergeyPetunin эти два поля являются общими в каждом классе, есть некоторые другие поля в этих классах, но эти два являются общими, и я только хочу, чтобы эти два поля в json –

ответ

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 
    } 
+0

это для второй части Вопросы, Есть ли что-то для первая часть? Могу ли я написать код в общем случае для всех классов? –

+0

Если вы не заботитесь о uuid и имени (я имею в виду конкретные поля), вы можете сделать общий JsonSerializer, как (ответ @Gregor Rayman), однако, если вы хотите создавать только объекты Json на основе id и имени из любого класс, то использование вашего класса User должно помочь. –

+0

эти два поля распространены в каждом классе, в этих классах есть и другие поля, но эти два являются общими, и мне нужны только эти два поля в json. и для JsonSerializer вещь, я новичок, и его код прошел намного выше моей головы: D –

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 
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 или что вы хотите.

Смежные вопросы