给定monocle项目中的JsonExample,我想创建一个镜头,在其中set调用将替换键/值对中的值,或者如果键/值对尚不存在则创建键/值对。
但是,这似乎用一个索引(可以组成安全类型)或一个不表示安全类型的at表示。
//for replacing:
(jsObject composeOptional index("age") composePrism jsNumber).set(45)
//for creating:
(jsObject composeLens at("age")).set(JsNumber(45)) <- will accept any old json
这是我可能的追求吗?
我还可以扩展它,例如,如果age嵌套在另一个JsObject中,例如:
val n = (jsObject composeOptional index("nested") composePrism
jsObject composeOptional index("age") composePrism jsNumber).set(45)
“嵌套”的键/值对尚不存在的地方,它将在嵌套时创建对象,然后添加字段
n(JsObject(Map.empty)) -> JsObject(Map("nested" -> JsObject("age" -> JsNumber(45)))
让我们来看看index
和at
签名JsObject
:
def at(field: String): Lens[JsObject, Option[Json]]
def index(field: String): Optional[JsObject, Json]
at
是一个Lens
目标,因此其目标('Option [Json]')始终存在。这意味着,我们可以add
,delete
并update
在Json
在的任何领域的元素JsonObject
。
import argonaut._, Argonaut._
import monocle.function._
(jObjectPrism composeLens at("name")).set(Some(jString("John")))(Json())
> res0: argonaut.Json = {"name":"John"}
(jObjectPrism composeLens at("name")).set(Some(jString("Robert")))(res0)
> res1: argonaut.Json = {"name":"Robert"}
(jObjectPrism composeLens at("name")).set(None)(res0)
> res2: argonaut.Json = {}
另一方面,index
是,Optional
因此目标(Json
)可能存在或可能不存在。这意味着index
只能update
值,但不能add
或delete
。
(jObjectPrism composeLens index("name")).set(jString("Robert"))(Json())
> res3: argonaut.Json = {}
(jObjectPrism composeLens index("name")).set(jString("Robert"))(res0)
> res4: argonaut.Json = {"name":"Robert"}
因此,回到最初的问题,如果您想在某个特定字段add
或对其进行update
赋值,则需要使用at
并将其包装在Json
中Some
(请参阅参考资料res1
),它将覆盖或创建该Json
字段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句