【问题标题】:Scala object to Json with Play API带有 Play API 的 Scala 对象到 Json
【发布时间】:2014-08-18 22:44:31
【问题描述】:

我需要处理这个问题没有回答的案例:Convert any Scala object to JSON

基本上,我不知道如何处理 List 和 Map 类型。我尝试了以下不起作用:

implicit val anyValWriter = Writes[Any] (a =>
  a match {
    case v: Double => Json.toJson(v)
    case v: Float => Json.toJson(v)
    case v: Long => Json.toJson(v)
    case v: Int => Json.toJson(v)
    case v: String => Json.toJson(v)
    case v: Iterable[Any] => Json.toJson(v.map(t => Json.toJson(t)).toList)
    case v: Map[String, Any] => JsObject(v.map { case (k, v) => (k, Json.toJson(v)) }.toList)
    // or, if you don't care about the value
    case _ => throw new RuntimeException("Type not serializable.")
})

产生的错误是:No Json serializer found for type Any. Try to implement an implicit Writes or Format for this type.

尝试将anyValWriter 添加到Json.toJson 会导致:recursive value anyValWriter needs type

有什么想法吗?

【问题讨论】:

  • 邪恶在我的Any 中。 JSON API 将无法找出如何根据其类型正确编码 Scala 值,因为具体没有类型 (Any)。
  • 但是为什么我们没有一个具体的类型而不是 Any 呢?
  • 请不要这样做。这与 Play JSON 处理编码和解码的方式完全不一致。
  • 对我来说,问题比那里“更高”。应用程序不应处于必须编码 Any 值的情况。要编码的值应该是已知类型,然后JSONWrites可以正确解析。
  • 我必须处理一个返回 Map[String, Any] 的底层 API。我真的被这种邪恶的类型困住了(Scala 编译器已经警告过我)

标签: json scala playframework-2.0


【解决方案1】:

我终于通过解决方法解决了我的问题。我选择不处理Writes[Any] 中的IterableMap 类型,并且我使用包装器来处理这两种类型,因为在我的情况下Any 不会出现List[...] 或@987654326 @。

下面是代码供有兴趣的人参考:

implicit val anyValWriter = Writes[Any] (a =>
  a match {
    case v: Double => Json.toJson(v)
    case v: Float => Json.toJson(v)
    case v: Long => Json.toJson(v)
    case v: Int => Json.toJson(v)
    case v: String => Json.toJson(v)
    case v: JsArray => v
    // or, if you don't care about the value
    case _ => throw new RuntimeException("Type not serializable.")
})

还有包装器:

  def convertToJsonValue(v : Iterable[Map[String, Any]])(implicit write: Writes[Any]) = {
    JsArray(v.map(t => JsObject(t.map {
      case (k, value) => (k, Json.toJson(value)(write)) }.toList)).toList)
  }

我以后会知道我是否可以解决丑陋的JsArray案例。

PS:我知道这是错误的,但我使用的是返回 Map[String, Any] 的 SQL API,因为我不知道将返回的列(我有充分的理由不使用ORM 功能)。

【讨论】:

  • 从 DB 输入数据不需要使用 ORM。
  • 我不敢相信你对我投了反对票……如果我想处理类型化的数据,我需要知道结果集是怎样的。因此,我需要提前知道我将从查询中获得的列。这与为 ORM 指定类的原则完全相同,即事先知道结果集的类型(我不知道,除了我将拥有字符串和数字类型)。我不知道对一个对我有帮助的答案投反对票是正确的,尤其是在我设置约束时(对此你没有什么可说的,伙计)
猜你喜欢
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2013-05-28
  • 2016-06-29
相关资源
最近更新 更多