【问题标题】:How to convert Future[Seq[SomeClass]] to Json?如何将 Future[Seq[SomeClass]] 转换为 Json?
【发布时间】:2017-01-12 05:57:06
【问题描述】:

在 Play 框架中,我将 Slick 与 MySQL 数据库一起使用,我如何将查询结果 (Future[Seq[SomeClass]]) 转换为 Json,以便在 jQuery 自动完成中进一步使用。我可以序列化 SomeClass ,但我应该在哪里使用 .map(或其他)?

添加

型号:

   package models
    import play.api.libs.json._

    case class Equipment(id: Long, name: String,area: String,kiMin: Double,kiMax: Double,cosFiMin: Double,cosFiMax: Double){

    implicit val equipmentWrites = new Writes[Equipment] {
    def writes(equipment: Equipment) = Json.obj(
    "id" -> equipment.id,
    "name" -> equipment.name,
    "area" -> equipment.area,
    "kiMin" -> equipment.kiMin,
    "kiMax" -> equipment.kiMax,
    "cosFiMin" -> equipment.cosFiMin,
    "cosFiMax" -> equipment.cosFiMax
    )

//also tried this for Seq

 /* def writes(equipment: Equipment): JsValue = {
    val equipmentSeq = Seq(
      "id" -> JsNumber(equipment.id),
      "name" -> JsString(equipment.name),
      "area" -> JsString(equipment.area),
      "kiMin" -> JsNumber(equipment.kiMin),
      "kiMax" -> JsNumber(equipment.kiMax),
      "cosFiMin" -> JsNumber(equipment.cosFiMin),
      "cosFiMax" -> JsNumber(equipment.cosFiMax)
    )
    JsObject(equipmentSeq)
  }*/

    }
    }

控制器:

   def auto(term: String) = Action {
    Ok(Json.toJson(equipmentDAO.get(term)))
  }

道:

def get(name: String): Future[Seq[Equipment]] = db.run((equipment.filter { _.name === name }).result)

添加2:

控制器方法:

def auto(term: String) = Action.async {
    val future: Future[Seq[Equipment]] = equipmentDAO.get(term)
    future.map { seqOfSomeClass =>
      Ok(Json.toJson(seqOfSomeClass))
    }
    }

序列化器:

implicit val equipmentWrites: Writes[Equipment] = (
    (JsPath \ "id").write[Long] and
      (JsPath \ "name").write[String] and
      (JsPath \ "area").write[String] and
      (JsPath \ "kiMin").write[Double] and
      (JsPath \ "kiMax").write[Double] and
      (JsPath \ "cosFiMin").write[Double] and
      (JsPath \ "cosFiMax").write[Double]
    )(unlift(Equipment.unapply))

【问题讨论】:

  • 需要更多细节。你在使用 Play JSON 框架,对吗?当您说“序列化 SomeClass”时,您的意思是序列化为 JSON,对吗?这种转换需要在哪里进行?在播放控制器中?你能发布控制器代码吗?
  • @virsox,添加了一些信息,不明白什么是 Play JSON 框架我使用的是 Play 2.5,它包含 Json,其他问题的答案是“是”。
  • 你不应该尝试“解析”Future[T],而是解析T“内部”Future

标签: json scala playframework future


【解决方案1】:

考虑到您了解Play Framework handles JSON 的原理并且已经拥有Reads and WritesSomeClass,您可以在控制器中执行以下操作:

def someAction = Action.async {
  val future: Future[Seq[SomeClass]] = ??? // get the future using Slick
  future.map { seqOfSomeClass =>
    Ok(Json.toJson(seqOfSomeClass))
  }
}

这将是serve a list of SomeClass in JSON

【讨论】:

  • 我已经编辑了帖子以显示我所做的事情(在“Added2:”之后),但我仍然收到“No Json serializer found for type Seq[models.Equipment]。试试为这种类型实现隐式写入或格式。”问题可能出在哪里?
  • 这个解决方案有效,我只需要将 Writes 放入伴随对象,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多