You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在字符串数组中添加空括号?Scala JSON序列化结果修正问询

Scala 相关问题解答

1. 如何在字符串数组中添加空括号?

哦,你说的“空括号”应该是指空的列表/数组元素吧?我猜你要么是想往字符串数组里加入空序列,要么是把某些元素替换成空序列?给你两种常见场景的写法:

场景1:往现有字符串数组末尾添加空数组

直接用Scala的:+操作符就能实现:

// 原字符串数组
val strArray = Array("hello", "world")
// 添加空数组后的新数组
val newArray = strArray :+ Array[String]()

场景2:按条件替换元素为空数组

如果要把数组中符合特定条件的元素换成空数组,用map结合条件判断即可:

val strArray = Array("r", "p", "s")
// 把非"r"的元素替换成空数组
val newArray = strArray.map(s => if (s == "r") s else Array[String]())

2. 修正Scala代码以生成期望的JSON输出

先揪出你当前代码的问题:当z != "r"时,你返回了空字符串"",所以序列化后会变成[""],但你要的是空列表[]。核心思路是过滤掉不符合条件的元素,而不是生成空字符串,这样没有符合条件元素的分组就会直接返回空序列。

修正后的完整代码

import play.api.libs.json.Json // 假设你使用Play JSON库,其他JSON库逻辑一致

val ss = List((1, 2, "r"), (2, 2, "r"), (1, 4, "r"), (1, 5, "p"), (1, 6, "s"))
val pp = ss.toArray
  .groupBy(_._2) // 按元组第二个元素分组
  .toSeq
  .sortBy(_._1) // 按分组key排序
  .map { case (_, group) =>
    // 只保留z=="r"的元素并格式化,不符合的直接过滤
    group.collect { case (x, y, z) if z == "r" => s"$x,$y,$z" }
  }
  .toList

// 序列化后得到期望的JSON
val desiredJson = Json.toJson(pp)

关键改动说明

  1. 把原来的map+条件返回空字符串,改成**collect+守卫条件**:collect只会保留符合z == "r"的元素,不符合的直接被过滤,不会生成空字符串。
  2. 去掉了else分支的"",这样当分组里没有符合条件的元素时,collect返回的就是空数组,序列化后自然就是[],而不是[""]。

测试结果

运行上述代码后,序列化的JSON结果为:

[ ["1,2,r", "2,2,r"], ["1,4,r"], [], [] ]

完全符合你的期望(注:你示例里的["1,3,r"]应该是笔误,原数据里没有对应元素)。


内容的提问来源于stack exchange,提问作者varsha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:33:10