【问题标题】:Scala/Play: JSON serialization issueScala/Play:JSON 序列化问题
【发布时间】:2013-11-11 19:46:06
【问题描述】:

我有一个简单的自定义数据结构,用于映射数据库中的结果:

case class Filter(id: Int, table: String, name: String, Type: String, structure: String)

生成的对象类型为List[Filter],如果转换为 JSON,它应该如下所示:

[
    {
        "id":           1,
        "table":        "table1",
        "name":         "name1",
        "Type":         "type1",
        "structure":    "structure1"
    },
    {
        "id":           2,
        "table":        "table2",
        "name":         "name2",
        "Type":         "type2",
        "structure":    "structure2"
    }
]

现在当我尝试将我的对象序列化为 JSON 时

val result: String = Json.toJson(filters)

我得到了类似的东西

No Json deserializer found for type List[Filter]. Try to implement an implicit Writes or Format for this type.

如何解决这个看似简单的问题而不编写一些荒谬的样板?

我的堆栈是 Play 2.2.1、Scala 2.10.3、Java 8 64bit

【问题讨论】:

  • 您是否检查过“类型”作为字段名称是否存在问题?

标签: json scala playframework playframework-2.0 jackson


【解决方案1】:

简答

只需添加:

implicit val filterWrites = Json.writes[Filter]

更长的答案

如果你看一下Json.toJson的定义,你会看到它的完整签名是:

def toJson[T](o: T)(implicit tjs: Writes[T]): JsValue = tjs.writes(o)

Writes[T] 知道如何获取T 并将其转换为JsValue。你需要有一个隐含的Writes[Filter] 知道如何序列化你的Filter 实例。好消息是 Play 的 JSON 库带有一个宏,可以为您实例化那些 Writes[_],因此您不必编写将案例类的字段转换为 JSON 值的无聊代码。要调用此宏并通过隐式搜索获取其值,请将上面的行添加到您的范围。

【讨论】:

  • 似乎不喜欢它 - 错误提示 No unapply function found。知道那是什么吗?
  • 以下代码编译并为我工作:gist.github.com/thesamet/7419702
  • FWIW,宏尝试在 companion object 中为您的案例类查找 unapply。您确定Filter 指的是一个案例类,而不是一个类或特征吗?
  • 范围存在问题,但现在可以正常工作了。有一件事令人困惑——implicit val filterWrites = Json.writes[Filter] 行。这个新的 val filterWrites 并没有真正在任何地方使用,那么为什么要声明它呢?
  • 它确实被使用了,只是隐式的。它被传递给第二个参数列表中对 Json.toJson 的调用。而不是implicit val,你可以明确地传递这个值:Json.toJson(filters)(Json.writes[Filter])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2010-12-12
  • 1970-01-01
相关资源
最近更新 更多