Scala/Play:JSON 序列化问题

3

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

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 64位。


你检查过是否出现了“Type”作为字段名称的问题了吗? - Marco Aurelio
1个回答

2

简短回答:

只需要添加:

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值。要调用此宏并使其值被隐式搜索捕获,请将上述行添加到您的范围内。

似乎不喜欢它 - 错误显示“未找到unapply函数”。你知道这是什么吗? - Caballero
以下代码在我的电脑上编译并运行成功:https://gist.github.com/thesamet/7419702 - thesamet
值得一提的是,该宏尝试在您的Case Class的伴生对象中查找“unapply”方法。你确定“Filter”是一个Case Class而不是一个Class或Trait吗? - thesamet
作用域出了问题,但现在已经解决了。有一件事情令人困惑——那就是implicit val filterWrites = Json.writes[Filter]这行代码。这个新的val filterWrites并没有真正被使用到,所以为什么还要声明它呢? - Caballero
它确实被使用,只是隐式地。它被传递到第二个参数列表中的Json.toJson调用中。您可以直接传递此值,而不是使用“implicit val”:Json.toJson(filters)(Json.writes[Filter]) - thesamet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接