下面是阿戈纳特透镜文献上一个示例的简化版本
import argonaut._, Argonaut._
val obj: Json = Parse.parseOption("""{"a":{"b":"x","c":2}}""").get
val lens1 = jObjectPL >=> jsonObjectPL("a") >=>
jObjectPL >=> jsonObjectPL("b") >=> jStringPL
lens1.mod(_ + "y", obj)
// res0: argonaut.Json = {"a":{"b":"xy","c":2}}如何对数字字段执行类似的操作?例如,假设我们希望将1添加到上面的obj中的数字,以获得
// res1: argonaut.Json = {"a":{"b":"x","c":3}}我的第一次尝试是
val lens2 = jObjectPL >=> jsonObjectPL("a") >=>
jObjectPL >=> jsonObjectPL("c") >=> jNumberPL
lens2.mod(_ + 1, obj)但这最后一行没有编译。
发布于 2015-08-26 09:50:32
Argonaut中的JsonString只是String的一个类型别名,但是数字稍微复杂一些,因为在JSON中没有能够完美表示数字的核心Scala类型。
Argonaut中的数值类型是JsonNumber,因此传递给mod的第一个参数的类型需要是(JsonNumber) => JsonNumber。
具有公共构造函数的JsonNumber子类型是:
JsonLongJsonBigDecimalJsonDouble下面是问题中最后一行代码的更正版本,使用JsonBigDecimal
lens2.mod(i => JsonBigDecimal(i.toBigDecimal + 1), obj)https://stackoverflow.com/questions/32223270
复制相似问题