Scala/Play - 通过从列表中获取部分数据构建聚合 JSON

Scala/Play - Building an aggregated JSON by getting partial data from the list

我有一个案例class:

case class Vehicle( type:String, brand: String, transmission: String)

我正在使用 Slick 查询包含案例 class 中所有列的数据库,我得到了这样的查询结果(对象列表):

List(Vehicle(car, audi, automatic), Vehicle(truck, toyota, automatic), Vehicle(motorcycle, bmw, manual))

我希望结果 JSON 看起来像这样:

{
    "vehicles" : [
        {
            "type"          : "car",
            "brand"         : "audi",
            "transmission"  : "automatic",
        },
        {
            "type"          : "truck",
            "brand"         : "toyota",
            "transmission"  : "automatic",
        },
        {
            "type"          : "motorcycle",
            "brand"         : "bmw",
            "transmission"  : "manual",
        }
    ]
}

现在要实现这一点,我可以轻松地使用一个可变列表并一个一个地映射我的数据库结果,然后构建一个像这样的 JSON。由于我已经在使用 Play Framework,写出 JSON 是小菜一碟。但是,我想以更实用的方式做事,而不使用任何可变变量。

如何从数据库结果中读取对象列表并将其放在一起,就像在结果中一样JSON?

定义车辆的Json格式,然后您可以通过Json.toJson(vehicles)

自动将List[Vehicle]转换为Json
import play.api.libs.json._

case class Vehicle( type:String, brand: String, transmission: String)

object Vehicle {
  implicit val vehicleFormat = Json.format[Vehicle]
}

//this will be slick function which gets data from database
def getVehiclesFromDB: Future[List[Vehicle]] = Future(List(Vehicle("a", "b", "c"), Vehicle("d", "e", "f")))

控制器内部

@Singleton
class Application @Inject() (vehiclesRepo: VehiclesRepo) extends Controller {
  def getVehicles = Action.async { 
    vehiclesRepo.getVehiclesFromDB.map { vehicles =>
     Ok(Json.toJson(vehicles))
    }
  }
}