【问题标题】:Json Parse obj without case class ref没有案例类引用的 Json Parse obj
【发布时间】:2013-07-01 10:51:06
【问题描述】:

我真的不知道如何解释我想做什么,所以我只是举个例子:

case class C1(id: String, name: String, description: String)
case class C2(id: String, status: Boolean)

trait Test[AnyRef] {

  implicit val writesC1 = Json.writes[C1]
  implicit val writesC2 = Json.writes[C2]

  def test(obj:AnyRef) = {
    println(Json.toJson(obj))
  }
}

object OC1 extends Test[C1] {}

object OC2 extends Test[C2] {}

val x = C1(1, "test", "desc test")

C1.test(x) // Here I want my C1 instance to be parsed as Json

【问题讨论】:

  • 我不明白您的代码中哪里有 JSON(我的意思是 Strings 包含 JSON)。你想序列化 x 到 JSON 吗? (从一个对象创建一个String
  • @gzm0 我的代码中没有 Json,但我想从 C1 或 C2 的案例类实例中生成 Json。
  • 好的。你有什么错误吗?我想您在Test.test 中缺少toJson 的隐含含义。

标签: json scala serialization playframework-2.0 deserialization


【解决方案1】:

这个怎么样:

trait Test[T] {

  implicit val writesT = Json.writes[T]

  def test(obj: T) {
    println(Json.toJson(obj))
  }
}

object C1 extends Test[C1]

val x = C1(1, "test", "desc test")

OC1.test(x)

很遗憾,我现在没有安装 play,我无法测试。

更新如果上面不起作用,这将:

trait Test[T] {
  implicit val writesT: Writes[T]
  // ...
}

object OC1 extends Test[C1] {
  implicit val writesT = Json.writes[C1]
}

但需要更多输入。

【讨论】:

  • 是的,这就是主意! AnyRef 在隐式解析的静态类型方面没有任何意义,因此您必须提供精确的类型 T 才能使用搜索隐式 Writes[T] 的 Json.toJson
  • 好吧,我一开始就在尝试,奇怪的是我收到了一个错误:没有找到 unapply 函数。我要去调查
  • @RochDelsalle Json.writes 实际上调用了一个宏,因此T 从一开始就没有完全了解可能是一个问题。看看更新。
  • 是的,即使在 OC1 中使用了覆盖隐式 val writesT,它仍然很奇怪我仍然在测试特征中得到“未找到未应用函数”
  • @RochDelsalle 你把writesT抽象化了吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2013-11-28
相关资源
最近更新 更多