【问题标题】:No Json formatter found Scala, Play framework error没有找到 Scala 的 Json 格式化程序,播放框架错误
【发布时间】:2013-02-05 04:13:59
【问题描述】:

我有以下两个隐式。

implicit val readObjectIdFormat = new Reads[ObjectId] {
def reads(jv: JsValue): JsResult[ObjectId] = {
  JsSuccess(new ObjectId(jv.as[String]))
 }
}

implicit val visitorFormat = (
(__ \ "_id").formatOpt[ObjectId] and
(__ \ "visitorId").format[String] and
(__ \ "referralUrl").formatOpt[String] and
(__ \ "ipAddress").formatOpt[String] and
(__ \ "promotionId").format[String])(Visitor)  

虽然 readObjectIdFormat 是在编译时定义的,但它一直在抱怨 "(__ \ "_id").formatOpt[ObjectId]" 行

找不到类型 org.bson.types.ObjectId 的 Json 格式化程序。尝试实现一个隐式 此类型的格式。

版本:Play 2.1-RC2、Scala 2.10

知道为什么它无法识别 readObjectIdFormat 吗?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    其他人给出了很好的答案,请改用格式。 顺便说一句,您可以处理解析错误。

    这个实现对我来说很好用:

      implicit val objectIdFormat: Format[ObjectId] = new Format[ObjectId] {
    
        def reads(json: JsValue) = {
          json match {
            case jsString: JsString => {
              if ( ObjectId.isValid(jsString.value) ) JsSuccess(new ObjectId(jsString.value))
              else JsError("Invalid ObjectId")
            }
            case other => JsError("Can't parse json path as an ObjectId. Json content = " + other.toString())
          }
        }
    
        def writes(oId: ObjectId): JsValue = {
          JsString(oId.toString)
        }
    
      }
    

    【讨论】:

      【解决方案2】:

      您正在实施Reads,而您需要实施Format

      implicit val readObjectIdFormat = new Format[ObjectId] {
       def reads(jv: JsValue): JsResult[ObjectId] = {
        JsSuccess(new ObjectId(jv.as[String]))
       }
      
       def writes(o: A): JsValue = JsString(...)
      }
      

      或者您需要使用读取而不是格式(注意我假设这适用于读取,尚未测试)。

      implicit val visitorRead = (
      (__ \ "_id").readOpt[ObjectId] and
      (__ \ "visitorId").read[String] and
      (__ \ "referralUrl").readOpt[String] and
      (__ \ "ipAddress").readOpt[String] and
      (__ \ "promotionId").read[String])(Visitor)  
      

      【讨论】:

      • 谢谢。就是这样。在使用简洁且更易读的版本作为隐式 val visitorReadFormat = Json.reads[Visitor] 深入研究文档和宏之后
      【解决方案3】:

      来自documentationFormat[T] extends Reads[T] with Writes[T]
      Format 是一个读+写

      然后写一个隐式 writeObjectIdFormat

      implicit val formatObjectIdFormat = 
         Format(readObjectIdFormat, writeObjectIdFormat)
      

      【讨论】:

        猜你喜欢
        • 2013-07-11
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 2014-01-28
        • 2015-02-01
        • 2011-11-09
        相关资源
        最近更新 更多