Playframework [Scala]:从 Twirl 中的 Scala 对象创建 JSON 列表

Playframework [Scala]: Create JSON List from Scala object in Twirl

我有一个对象列表,其中我只需要每个对象的 ID(String 类型)属性。

在视图中,我设置了 Google 跟踪代码管理器,需要将每个对象的 ID 作为 JSON 数组传递。我不确定如何在 Twirl 中执行此操作,因为我正在使用 script 标记内的 Scala 对象。我需要每个字符串都用引号括起来,用逗号分隔,每边都有方括号,比如 ["one","two","three"]。有什么办法吗?

权限值给我带来了麻烦:

@()(implicit currentUser: User = new User())
<script>
dataLayer = [{
   'userId': '@currentUser.userId',
   'firstName': '@currentUser.firstName',
   'lastName': '@currentUser.lastName',
   'permissions': ['@currentUser.permissions.map(p => p.permissionId).mkString(",")']
}];
</script>    

通过将 Play 中的 Json 库与 Javascript 相结合,我能够获得常规 JSON 列表。

@()(implicit currentUser: User = new User())

@import play.api.libs.json._
<script>
  var rawPermissions = '@Json.toJson(currentUser.permissions.map(p => p.permissionId))';
  var permissions = JSON.parse(rawPermissions.replace(/&quot;/g, "\""));
  dataLayer = [{
     'userId': '@currentUser.userId',
     'firstName': '@currentUser.firstName',
     'lastName': '@currentUser.lastName',
     'permissions' : permissions
  }];
</script>
<!-- Google Tag Manager -->

我建议在以这种方式传递数据时,像这样提前构建对象:

<script>
  dataLayer = @Html(Json.toJson(Seq({
     "userId" -> currentUser.userId
     "firstName" -> currentUser.firstName,
     "lastName"" -> currentUser.lastName
     "permissions" -> currentUser.permissions.map(_.permissionId)
  )).toString);
</script>

另一种方法是预定义一些隐式 Format[User] 并将其导入以编写 Json:

@import simpleUserJsonFormat
<script>
  dataLayer = @Html(Json.toJson(Seq(currentUser)).toString);
</script>