如何更新JSON数组所有对象的timestamp属性?Scala编译错误求助
问题:Scala遍历JSONArray更新属性时的编译错误及解决方案
你遇到的这个编译错误,核心原因是Scala编译器无法自动推断出forEach回调中obj的参数类型。具体来说,org.json.simple.JSONArray是Java生态的类,它的forEach方法接受的是java.util.function.Consumer<? super Object>,由于Java泛型擦除的特性,Scala编译器没办法从这个方法签名里获取到元素的具体类型,必须显式指定obj的类型才能通过编译。
错误修正方案
你只需要给回调函数的参数加上显式类型声明即可,另外其实不需要把JSONObject转成HashMap——JSONObject本身就提供了put方法可以直接修改属性:
import org.json.simple.{JSONArray, JSONObject} myJsonArray.forEach { (obj: Any) => val jsonObject = obj.asInstanceOf[JSONObject] jsonObject.put("timestamp", 456) }
如果能确定JSONArray里的元素都是JSONObject,也可以直接指定类型为JSONObject,简化类型转换:
myJsonArray.forEach { (obj: JSONObject) => obj.put("timestamp", 456) }
其他更Scala风格的实现方案
1. 利用Scala集合转换器(CollectionConverters)
把Java的JSONArray转换成Scala风格的集合,这样可以使用Scala原生的foreach方法,类型推断会更友好:
import org.json.simple.{JSONArray, JSONObject} import scala.jdk.CollectionConverters._ // 转成Scala Iterable后遍历修改 myJsonArray.asScala.foreach { obj => val jsonObject = obj.asInstanceOf[JSONObject] jsonObject.put("timestamp", 456) }
2. 使用Scala原生JSON库(推荐)
如果项目允许,建议使用更符合Scala函数式风格的JSON库(比如circe、Play JSON),避免依赖Java的json-simple,代码会更简洁且更安全:
以circe为例,先添加sbt依赖:
libraryDependencies += "io.circe" %% "circe-core" % "0.14.6" libraryDependencies += "io.circe" %% "circe-parser" % "0.14.6" libraryDependencies += "io.circe" %% "circe-generic" % "0.14.6"
然后编写代码:
import io.circe._, io.circe.parser._, io.circe.syntax._ // 假设你的JSON数组来自字符串,也可以从其他来源解析 val jsonInput = """[ {"firstName":"Pierre","age":"20","timestamp":"123"}, {"firstName":"Jack","age":"20","timestamp":"123"}, {"firstName":"Olive","age":"20","timestamp":"123"}, {"firstName":"Tom","age":"20","timestamp":"123"} ]""" // 解析JSON并更新每个元素的timestamp val updatedJson = parse(jsonInput) .flatMap(_.asArray) // 提取JSON数组 .map(_.map { jsonObj => // 给每个JSON对象添加/更新timestamp字段 jsonObj.mapObject(_.add("timestamp", Json.fromInt(456))) }) .map(_.asJson) // 转回JSON值 .getOrElse(Json.arr()) // 处理解析失败的情况 // 输出格式化后的结果 println(updatedJson.spaces2)
这种方式是纯函数式的,不会修改原对象,而是生成新的JSON结构,更符合Scala的设计理念。
内容的提问来源于stack exchange,提问作者a.moussa
相关产品推荐
相关产品推荐

