无法在Play Scala中将带有Enum的Map解析为Json

阿泰斯

我们使用Scala 2.11.8Play framework 2.5.8

使用的数据可以很简单:

object EnumA extends Enumeration {
  type EnumA = Value
  val ONE, TWO, THREE = Value
}

case class NoWork(data: Map[EnumA.Value, String] = Map.empty)

我要存档的是能够将NoWork解析Json我知道,它需要为提供隐式格式化程序Enumeration

我找到了这个解决方案:https : //stackoverflow.com/a/15489179/1549135并应用了它。

提供这些隐式内容的伴随对象如下所示:

object NoWork {
  implicit val enumAFormat = EnumUtils.enumFormat(EnumA)

  implicit val jsonModelFormat = Json.format[NoWork]
}

它总是失败并显示错误:

error: No implicit format for Map[EnumA.Value,String] available.
         implicit val jsonModelFormat = Json.format[NoWork]
                                                   ^

有什么问题?

我已经测试并更改了data类型以Map[String, String]允许序列化。Enum对自己的序列化了,所以现在-如何修复MapEnum类型?

谢谢!

编辑

作为帕姆的答案

implicit val writes = new Writes[Map[EnumA.Value, String]] {
     override def writes(o: Map[EnumA.Value, String]): JsValue = Json.toJson(o.map { case (a, b) => Json.parse(s"""{${Json.toJson(a)}:${Json.toJson(b)}}""")}.toList)
}

显然可以在这种情况下工作,我实际上需要一个通用的解决方案,供Map[Enum, T]我在整个应用程序中使用。

阿泰斯

与同事一起,我们准备了一个通用类,该类为Map[E <: Enum[E], T]类型提供JSON序列化

Enum类型始终会转换String为所需的类型JsObject key另一个参数是通用参数,可使用implicit format: Format[T]

import play.api.data.validation.ValidationError
import play.api.libs.json._    
import scala.util.{Failure, Success, Try}

class MapEnumFormat[E <: Enum[E], T](valueOf: (String => E))(implicit format: Format[T]) extends Format[Map[E, T]] {

  override def writes(o: Map[E, T]): JsValue = {
    JsObject(o.map { case (a, b) => (a.name, Json.toJson(b)) })
  }

  override def reads(json: JsValue): JsResult[Map[E, T]] = {
    val result = Try(json.as[Map[String, T]].map {
      case (key, value) =>
        valueOf(key) -> value
    })

    result match {
      case Success(status) =>
        JsSuccess(status)
      case Failure(th) =>
        JsError(ValidationError(s"Error while serializing $json: $th"))
    }
  }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我无法将带有嵌套元素的json字符串解析为jquery

Scala / Play:将JSON解析为Map而不是JsObject

无法解析Google Play服务版本15.0.2

无法在Play / Scala中打印LoggerContext

无法解析符号“ gms”。无法导入Google Play服务

无法使用mysql结果解析符号scala play2

Scala-Heroku-Play !:无法解析符号ReverseApplication

我无法将Scala设置为Play的默认版本

我无法在带有eclipse的play项目中导入play-slick dep

无法解析intellij的符号@ integer / google_play_services_version

无法解析Google Play应用评分数据

Play Framework和IntelliJ-无法解析符号索引/路线

使用Scala和Play Framework无法登录才能正常工作

无法使用Play for Scala和Anorm从表单插入值

我无法为Google Play服务编译实例ID

无法为Google云消息传递配置Google Play服务

添加swagger-play2依赖关系后,Scala Play项目无法构建-sbt无法找到播放?

无法在Tkinter中将带有网格的按钮添加到列表中

无法在Play for Scala中将ByteArrayOutputStream发送到浏览器

试图将带有 em 破折号的 JSON 字符串从 Tcl 传递到浏览器,但无法解析?

GSON-无法将Json解析为具有List和Map的复杂POJO

无法识别JSON字符串在Play Framework控制器中将Google图表传递给Scala视图,也无法显示图表

无法为Scala Play启动sbt!项目(sbt.ResolveException:未解决的依赖项)

无法将带有[]的索引应用于类型为'object'的表达式

无法将带有[]的索引应用于类型为'DateTime'的表达式

无法将带有类型参数的 Java 类重写为 Kotlin

如何将具有从 HTTP 请求收到的天数的 Json 解析为 Scala 和 Play 框架中的列表

Google Play商店无法上传带有“被CORS政策阻止”错误的应用程序图标

非隐式Writes无法处理Option(Scala,JSON,Play 2.3.6)