我正在使用Play JSON (最新版本;Play 2.4),将传入的JSON读入对象。
在编写JSON时,使用自定义对象列表绝对没有问题,只要我有implicit val writes = Json.writes[CustomType]。
但是很明显,相反的情况不是真的,因为下面的内容并不有效,即使为顶级类型和列表项类型都生成了Reads (使用Json.reads[Incoming]和Json.reads[Item])。定制的Reads实现是强制性的吗?还是我漏掉了什么明显的东西?最简单的方法是什么?
简化示例:
杰森:
{
"test": "...",
"items": [
{ "id": 44, "time": "2015-11-20T11:04:03.544" },
{ "id": 45, "time": "2015-11-20T11:10:10.101" }
]
}与输入数据相匹配的模型/DTO:
import play.api.libs.json.Json
case class Incoming(test: String, items: List[Item])
object Incoming {
implicit val reads = Json.reads[Incoming]
}
case class Item(id: Long, time: String)
object Item {
implicit val reads = Json.reads[Item]
}主计长:
def test() = Action(parse.json) { request =>
request.body.validate[Incoming].map(incoming => {
// ... handle valid incoming data ...
}).getOrElse(BadRequest)
}编译器可以这样说:
No implicit format for List[models.Item] available.
[error] implicit val reads = Json.reads[Incoming]
^
No Json deserializer found for type models.Incoming.
Try to implement an implicit Reads or Format for this type.
[error] request.body.validate[Incoming].map(incoming => {发布于 2016-01-05 16:21:03
尝试在Item的case类和对象之前定义Incoming的case类和对象。有关更多信息,请参见以下答案:https://stackoverflow.com/a/15705581
发布于 2016-01-05 16:23:55
问题可能在您在Controller中的导入中。只要导入“传入”,就会导入case类。为了导入隐式val,尝试"Incoming._“。它将导入传入对象的所有成员。
https://stackoverflow.com/questions/34615571
复制相似问题