首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Play JSON将数组读入自定义对象列表的最简单方法

使用Play JSON将数组读入自定义对象列表的最简单方法
EN

Stack Overflow用户
提问于 2016-01-05 15:41:50
回答 2查看 2K关注 0票数 1

我正在使用Play JSON (最新版本;Play 2.4),将传入的JSON读入对象。

在编写JSON时,使用自定义对象列表绝对没有问题,只要我有implicit val writes = Json.writes[CustomType]

但是很明显,相反的情况不是真的,因为下面的内容并不有效,即使为顶级类型和列表项类型都生成了Reads (使用Json.reads[Incoming]Json.reads[Item])。定制的Reads实现是强制性的吗?还是我漏掉了什么明显的东西?最简单的方法是什么?

简化示例:

杰森:

代码语言:javascript
复制
{
  "test": "...",
  "items": [
     { "id": 44, "time": "2015-11-20T11:04:03.544" },
     { "id": 45, "time": "2015-11-20T11:10:10.101" }
  ]
}

与输入数据相匹配的模型/DTO:

代码语言:javascript
复制
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]
}

主计长:

代码语言:javascript
复制
def test() = Action(parse.json) { request =>
  request.body.validate[Incoming].map(incoming => {
     // ... handle valid incoming data ...
  }).getOrElse(BadRequest)
}

编译器可以这样说:

代码语言:javascript
复制
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 => {
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-05 16:21:03

尝试在Item的case类和对象之前定义Incoming的case类和对象。有关更多信息,请参见以下答案:https://stackoverflow.com/a/15705581

票数 3
EN

Stack Overflow用户

发布于 2016-01-05 16:23:55

问题可能在您在Controller中的导入中。只要导入“传入”,就会导入case类。为了导入隐式val,尝试"Incoming._“。它将导入传入对象的所有成员。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34615571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档