Play 2.x中Generics的JSON格式

时间:2017-02-03 16:11:02

标签: scala playframework playframework-2.0

我的课程看起来像这样

class test: UIView {   

   var value: Float

   override func drawRect(rect: CGRect) {
      self.addSubview(getSlider())
      self.addSubview(getLabel())   
   }

   override init(frame: CGRect) {
      value = 0.9
      super.init(frame:frame)   
   }

   func getSlider()-> UISlider {
      let slider: UISlider = UISlider(frame: CGRectMake(10,10,self.frame.width,30))
      slider.addTarget(self, action:"change", forControlEvents:UIControlEvents.ValueChanged)
      return slider   
  }

   func getLabel()-> UILabel {
      let label = UILabel(frame: CGRectMake(10,50,50,50))
      label.text = "\(value)"

      return label   
   } 

 func change(sender: UISlider) {
    value = sender.value
 }

我有这方面的实现,例如

trait Value[T] {
  def get:T
}

问题是我需要为这些类型创建jsonFormat才能将它保存到MongoDB。

我坚持了两天,但仍然无法弄清楚如何让它发挥作用

1 个答案:

答案 0 :(得分:4)

对于为Reads(泛型类型)返回Option的提供的.nullable,您需要首先强制Value的类型参数本身提供了所需的ReadsWrites的实例。

因此,对于通用Reads[Value[T]],最小def将如下所示。

def valueReads[T](implicit underlying: Reads[T]): Reads[Value[T]] = ???

类似地,对于Writes[Value[T]](或OWrites,如果它需要限制为JSON对象,因此BSON文档),最小定义将如下。

def valueWrites[T](implicit underlying: Writes[T]): Writes[Value[T]] = ???
// or
def valueOWrites[T](implicit underlying: Writes[T]): OWrites[Value[T]] = ??? // don't define both as implicit to avoid conflict

然后,实现取决于您希望将Value[T]表示为JSON的方式。

考虑以下JSON表示:

{ "_value": ... }

...然后Reads会像下面那样。

implicit def valueReads[T](implicit underlying: Reads[T]): Reads[Value[T]] =
  Reads[Value[T]] { json =>
    (json \ "_value").validate(underlying).map { t: T =>
      Value(t)
    }
  }

类似地,OWrites[Value[T]]将如下。

implicit def valueWrites[T](implicit underlying: Writes[T]): OWrites[Value[T]] =
  OWrites[Value[T]] { value => Json.obj("_value" -> value) }
  

显然,这些含义必须在隐式范围内,或者通过在Value伴随对象中定义,或者在其他地方定义时显式导入。