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

时间:2018-07-10 18:51:31

标签: json scala playframework

我有一个对象列表,我只需要每个对象的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>    

2 个答案:

答案 0 :(得分:1)

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

<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>

答案 1 :(得分:0)

通过将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 -->