2013-08-02 2 views
0

Я использую Play 2.1 и MongoJack для создания класса scala для отображения Mongo db, а также для сериализации Json. Я хочу иметь кортеж в этой модели (см. Ниже «upload»). Тем не менее, я не могу заставить Json Writes работать для кортежа опций.Play 2.1 Json Writes for Option Tuple

class Event (
    @BeanProperty @JsonProperty("name") val name: String, 
    @BeanProperty @JsonProperty("message") val message: String 
) { 
    @ObjectId @Id @BeanProperty var eventId: String = _ 
    @BeanProperty @JsonProperty("upload") var upload: Option[(String, String, Int)] = _ 
} 

object Event { 
    def apply(name: String, 
     message: String): Event = new Event(name,message) 

    def unapply(e: Event) = 
    new Some((e.name, 
       e.message, 
       e.upload)) 

    import play.api.libs.json.Writes._ 
    val eventWrites: Writes[Event] = (
    (__ \ 'name).write[String] and 
    (__ \ 'message).write[String] and 
    (__ \ 'upload).write(Option[(// HOW TO WRITE A OPTIONAL TUPLE? 
     (__ \ 'url).write[String] and 
     (__ \ 'name).write[String] and 
     (__ \ 'size).write[Int] 
     tupled 
    )]) 
    )(unlift(Event.unapply)) 
} 

EDIT 1:

Заменить загрузки начальное значение с

@BeanProperty @JsonProperty("upload") var upload: Option[(String, String, Int)] = None 

ответ

2

Ваши записи будут выглядеть следующим образом:

val eventWrites: Writes[Event] = (
    (__ \ 'name).write[String] and 
    (__ \ 'message).write[String] and 
    (__ \ 'upload).writeNullable((
    (__ \ 'url).write[String] and 
    (__ \ 'name).write[String] and 
    (__ \ 'size).write[Int]).tupled))(unlift(Event.unapply)) 

Вам не нужно импорт Writes._

+0

Спасибо! Оно работает. Кроме того, я должен изменить значение инициализации загрузки на None. – angelokh