喷json隐式UUID转换

Posted

技术标签:

【中文标题】喷json隐式UUID转换【英文标题】:spray json implicit UUID conversion 【发布时间】:2015-10-03 02:26:55 【问题描述】:

我有一个用户模型

case class User(name: String, email: String, password: Option[String] = None, key: Option[UUID] = None)

使用 spray-json 编组器

object UserJsonSupport extends DefaultJsonProtocol with SprayJsonSupport 
  implicit val userFormat = jsonFormat4(User)

在我将关键字段从 Option[String] 转换为 Option[UUID] 之前它一直有效,现在我得到两个编译错误:

Error:(8, 40) could not find implicit value for evidence parameter of type in.putfood.http.UserJsonSupport.JF[Option[java.util.UUID]]
  implicit val userFormat = jsonFormat4(User)
                                       ^
Error:(8, 40) not enough arguments for method jsonFormat4: (implicit evidence$16: in.putfood.http.UserJsonSupport.JF[String], implicit evidence$17: in.putfood.http.UserJsonSupport.JF[String], implicit evidence$18: in.putfood.http.UserJsonSupport.JF[Option[String]], implicit evidence$19: in.putfood.http.UserJsonSupport.JF[Option[java.util.UUID]], implicit evidence$20: ClassManifest[in.putfood.model.User])spray.json.RootJsonFormat[in.putfood.model.User].
Unspecified value parameters evidence$19, evidence$20.
  implicit val userFormat = jsonFormat4(User)
                                   ^

我的理解是,由于this issue 已解决,它应该可以正常工作,而无需提供我自己的 UUID 反序列化程序。是我弄错了还是完全是另外一回事?

它可能不喜欢在Option 中吗?

【问题讨论】:

【参考方案1】:

它可能应该已经解决了,但是,我最近遇到了同样的问题(使用 akka-http v10.0.0 时),我能够通过定义以下内容来解决它

  implicit object UUIDFormat extends JsonFormat[UUID] 
    def write(uuid: UUID) = JsString(uuid.toString)
    def read(value: JsValue) = 
      value match 
        case JsString(uuid) => UUID.fromString(uuid)
        case _              => throw new DeserializationException("Expected hexadecimal UUID string")
      
    
  

解决方案是从Fidesmo API借来的。


更新:

我添加了一个包含最常见用例的库。 Link here>

【讨论】:

以上是关于喷json隐式UUID转换的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型“newtonsoft.json.linq.jtoken”隐式转换为 newt“newtonsoft.json.linq.jvalue”

Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定

scala中的隐式json转换器在运行时为null

在子类中重用 json 隐式读取器

C#中的类型转换-自定义隐式转换和显式转换

15Scala隐式转换和隐式参数