如何在 play scala 中将 Map 转换为 Json

How to convert a Map to a Json in play scala

如何在 Scala 中将以下 Map 结构(Map[String,Any])转换为 Json?我正在使用 Play。

  val result =  s
  .groupBy(_.dashboardId)
  .map(
  each => Map(
  "dashboardId" -> each._1,
  "cubeId" -> each._2.head.cubeid,
  "dashboardName" -> each._2.head.dashboardName,
  "reports" -> each._2.groupBy(_.reportId).map(
    reportEach => Map(
      "reportId" -> reportEach._1,
      "reportName" -> reportEach._2.head.reportName,
      "selectedColumns" -> reportEach._2.groupBy(_.selectedColumnid).map(
        selectedColumnsEach => Map(
          "selectedColumnId" -> selectedColumnsEach._1,
          "columnName" -> 
          selectedColumnsEach._2.head.selectColumnName.orNull,
          "seq" ->selectedColumnsEach._2.head.selectedColumnSeq,
          "formatting" -> selectedColumnsEach._2
            )
         )
       )
     )
   )
 )

我使用 .toSeq 将结果读取到 Seq[Map[String,Any]] 中,然后使用 Json 将其转换为 Json 这有效。

val s = new SaveTemplate getReportsWithDashboardId(dashboardId)
val result : Seq[Map[String,Any]] =  s.groupBy(_.dashboardId)
  .map(
    each => Map(
      "dashboardId" -> each._1,
      "cubeId" -> each._2.head.cubeid,
      "dashboardName" -> each._2.head.dashboardName,
      "reports" -> each._2.groupBy(_.reportId).map(
        reportEach => Map(
          "reportId" -> reportEach._1,
          "reportName" -> (reportEach._2.find(_.reportName != null) match {
          case Some(reportNameData) => reportNameData.reportName
          case None => null
        }),
          "selectedColumns" -> reportEach._2.groupBy(_.selectedColumnid).map(
            selectedColumnsEach => Map(
              "selectedColumnId" -> selectedColumnsEach._1,
              "columnName" -> selectedColumnsEach._2.head.selectColumnName.orNull,
              "seq" ->selectedColumnsEach._2.head.selectedColumnSeq,
              "formatting" -> Map(
              "formatId" -> (selectedColumnsEach._2.find(_.formatId != null) match {
                case Some(reportNameData) => reportNameData.formatId
                case None => null
              }),
              "formattingId" -> (selectedColumnsEach._2.find(_.formattingid != null) 
              match {
                case Some(reportNameData) => reportNameData.formattingid
                case None => null
              }),
              "type" -> (selectedColumnsEach._2.find(_.formattingType != null) match 
              {
                case Some(reportNameData) => reportNameData.formattingType
                case None => null
              })
            )
           )
          )
        )
      )
    )
  ).toSeq
val k = toJson(result)
Ok(k)

您无法将 Map[String, Any] 转换为 Json,但可以将 Map[String, String]Map[String, JsValue] 转换为

在您的情况下,您可以通过以下方式将每个地图值转换为 JsValue

Map(
  "dashboardId" -> Json.toJson(each._1),
  "cubeId" -> Json.toJson(each._2.head.cubeid),
  "dashboardName" -> Json.toJson(each._2.head.dashboardName),
  "reports" -> Json.toJson(each._2.groupBy(_.reportId).map(
    reportEach => Map(
      "reportId" -> Json.toJson(reportEach._1),
      "reportName" -> (reportEach._2.find(_.reportName != null) match {
      case Some(reportNameData) => Json.toJson(reportNameData.reportName)
      case None => JsNull
    })),
  ...
)