有没有更简洁的方法可以使用Argonaut删除顶级JSON属性?

有没有更简洁的方法可以使用Argonaut删除顶级JSON属性?,json,scala,zipper,argonaut,Json,Scala,Zipper,Argonaut,假设我有一个小的Json实例: import argonaut._, Argonaut._ Json.obj( "id" := 42, "viewed" := false ) 现在,我想删除其密钥为已查看的的对。我发现下面的内容很有用,但有点太冗长了。还有比这个短的吗 for { field <- json.cursor.downField("viewed") updated <- field.delete } yield updated.undo

假设我有一个小的
Json
实例:

import argonaut._, Argonaut._

Json.obj(
  "id"     := 42,
  "viewed" := false
)
现在,我想删除其密钥为
已查看的
的对。我发现下面的内容很有用,但有点太冗长了。还有比这个短的吗

for {
  field   <- json.cursor.downField("viewed")
  updated <- field.delete
} yield updated.undo

为什么
undo
被命名为
undo
的问题仍然存在。

光标是浮动/移动的引用,就像C/C++中的指针一样。 downField是指向光标的移动指令,因此,如果不撤消,光标将保留在“已查看”属性中,而不是父json对象中。
要返回到父json对象,您必须撤消以移动光标。

作为旁注,您使用的大多数方法都有运算符别名:
-(!(json.acursor--“已查看”)
。关于
undo
:这在反XML的
unselect
模型上是有意义的-你不是在撤销修改,而是在撤销树中的导航。@TravisBrown谢谢。我知道操作员的别名,我只是不想让我的同事(太多)震惊。关于
undo
。。。好吧,现在我明白为什么它可能会被命名为那样,但男孩,它读起来真的错了。通常,人们会认为它会撤消最后一个操作。例如,
downField(“X”).downField(“Y”).undo.undo
应该回到我最初的位置。不好的名字叫IMHO。谢谢你的帮助。
json.hcursor.downField("viewed").delete.undo