【问题标题】:Create Reads/Writes for Java Enum without Field为没有字段的 Java 枚举创建读/写
【发布时间】:2014-03-11 07:33:25
【问题描述】:

使用 Play Framework 的 JSON 库,如何为没有字段的 Java 枚举创建 ReadsWrites

public enum EnumNoFields { RED, WHITE, BLUE }

implicit val EnumNoFieldsReads: Reads[EnumNoFields] = ?
implicit val EnumNoFieldsWrites: Writes[EnumNoFields] = ?

【问题讨论】:

标签: json scala playframework enums


【解决方案1】:

我只是使用了Enum#name

  implicit val EnumNoFieldsReads: Reads[EnumNoFields] =
    (JsPath \ "displayValue").read[String].map{x: String => EnumNoFields.valueOf(x)}

  implicit val EnumNoFieldsWrites: Writes[EnumNoFields] =
    (JsPath \ "displayValue").write[String].contramap{x:EnumNoFields => x.name}

【讨论】:

【解决方案2】:

通用解决方案如下所示:

def javaEnumFormat[E <: Enum[E] : ClassTag] = new Format[E] {
  override def reads(json: JsValue): JsResult[E] = json.validate[String] match {
    case JsSuccess(value, _) => try {
      val clazz = implicitly[ClassTag[E]].runtimeClass.asInstanceOf[Class[E]]
      JsSuccess(Enum.valueOf(clazz, value))
    } catch {
      case _: IllegalArgumentException => JsError("enumeration.unknown.value")
    }
    case JsError(_) => JsError("enumeration.expected.string")
  }

  override def writes(o: E): JsValue = JsString(o.toString)
}

你可以这样使用:

implicit val enumNoFieldsFormat = javaEnumFormat[EnumNoFields]

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多