我正在尝试使用ujson library实现一个插入函数。
这是我的尝试:
import ujson.{Obj, Value}
import upickle.default._
object Example extends App {
def r = transform(
List(Map(
"a" -> Map("b" -> Obj("c" -> List(1,2,3), "d" -> List(2,4,6))),
"e" -> Map("f" -> Obj("g" -> List(1,2,3)))))
).to(Value)
def insert(j: ujson.Value, k: String, v: ujson.Value): Unit = j match {
case a: ujson.Arr => a.arr.foreach(e => insert(e, k, v))
case o: ujson.Obj =>
if (o.obj.keySet contains k) o.obj(k) = v
else o.obj.values.foreach(e => insert(e, k, v))
case _ => Nil
}
println(r)
insert(r, "b", transform(None).to(Value))
println(r)
}但是,这给我的输出是不变的:
[{"a":{"b":{"c":[1,2,3],"d":[2,4,6]}},"e":{"f":{"g":[1,2,3]}}}]
[{"a":{"b":{"c":[1,2,3],"d":[2,4,6]}},"e":{"f":{"g":[1,2,3]}}}]既然值类型是可变的,为什么不改变并使用json值对象r的值v来更新键k呢?
发布于 2020-06-18 16:36:15
每次调用r时,您都会重新创建Value,因此,您对它所做的每一次更改都会被忽略。
当您调用println(r)时,您将创建一个副本。
然后,您使用insert(r, "b", transform(None).to(Value))创建一个单独的副本,对其进行修改并将其删除。
然后使用另一个println(r)创建第三个副本。
如果您想引用同一对象,请使用val而不是def。
https://stackoverflow.com/questions/62438502
复制相似问题