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 64bit

4

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

于 2013-11-11T20:00:17.300 回答