如何在字符串数组中添加空括号?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)
关键改动说明
- 把原来的
map+条件返回空字符串,改成**collect+守卫条件**:collect只会保留符合z == "r"的元素,不符合的直接被过滤,不会生成空字符串。 - 去掉了else分支的
"",这样当分组里没有符合条件的元素时,collect返回的就是空数组,序列化后自然就是[],而不是[""]。
测试结果
运行上述代码后,序列化的JSON结果为:
[ ["1,2,r", "2,2,r"], ["1,4,r"], [], [] ]
完全符合你的期望(注:你示例里的["1,3,r"]应该是笔误,原数据里没有对应元素)。
内容的提问来源于stack exchange,提问作者varsha
相关产品推荐
相关产品推荐

