使用 Play JSON API 将数组读入自定义对象列表的最简单方法
Simplest way to read an array into a list of custom objects with Play JSON API
我正在使用 Play JSON API(最新版本;Play 2.4),将传入的 JSON 读入对象。
写JSON时,使用自定义对象列表绝对没有问题,只要我有implicit val writes = Json.writes[CustomType]
.
但显然反过来不成立,因为即使为顶级类型和列表项类型生成了 Reads
(使用 Json.reads[Incoming]
和 Json.reads[Item]
).自定义 Reads
实施是强制性的吗?还是我错过了一些明显的东西?让这项工作最简单的方法是什么?
简化示例:
JSON:
{
"test": "...",
"items": [
{ "id": 44, "time": "2015-11-20T11:04:03.544" },
{ "id": 45, "time": "2015-11-20T11:10:10.101" }
]
}
Models/DTOs匹配传入数据:
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 => {
尝试在 Incoming
之前定义 class 的大小写和 Item
的对象。有关详细信息,请参阅此答案:
问题可能出在您在 Controller 中的导入中。只需导入 "Incoming" 就会导入案例 class。为了导入隐式 val,请尝试 "Incoming._"。这将导入对象传入的所有成员。
我正在使用 Play JSON API(最新版本;Play 2.4),将传入的 JSON 读入对象。
写JSON时,使用自定义对象列表绝对没有问题,只要我有implicit val writes = Json.writes[CustomType]
.
但显然反过来不成立,因为即使为顶级类型和列表项类型生成了 Reads
(使用 Json.reads[Incoming]
和 Json.reads[Item]
).自定义 Reads
实施是强制性的吗?还是我错过了一些明显的东西?让这项工作最简单的方法是什么?
简化示例:
JSON:
{
"test": "...",
"items": [
{ "id": 44, "time": "2015-11-20T11:04:03.544" },
{ "id": 45, "time": "2015-11-20T11:10:10.101" }
]
}
Models/DTOs匹配传入数据:
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 => {
尝试在 Incoming
之前定义 class 的大小写和 Item
的对象。有关详细信息,请参阅此答案:
问题可能出在您在 Controller 中的导入中。只需导入 "Incoming" 就会导入案例 class。为了导入隐式 val,请尝试 "Incoming._"。这将导入对象传入的所有成员。