我有一个简单的自定义数据结构,可用于映射数据库的结果:
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
简短答案:
只需添加:
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[_]
为您实例化它们的宏,因此您不必编写无聊的代码即可将case类的字段转换为JSON值。要调用此宏并通过隐式搜索获取其值,请将上面的行添加到您的范围中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句