1

这是Argonaut 镜头文档中示例的简化版本:

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)

但是最后一行没有编译。

4

1 回答 1

1

JsonString在 Argonaut 中只是 的类型别名String,但数字稍微复杂一些,因为没有核心 Scala 类型可以完美地表示 JSON 中的数字。

Argonaut 中的数值类型是JsonNumber,因此传递给的第一个参数的类型mod需要是(JsonNumber) => JsonNumber

JsonNumber具有公共构造函数的子类型是:

  • JsonLong
  • JsonBigDecimal
  • JsonDouble

这是问题中最后一行代码的更正版本,使用JsonBigDecimal

lens2.mod(i => JsonBigDecimal(i.toBigDecimal + 1), obj)
于 2015-08-26T09:50:32.020 回答