2015-08-26 24 views
1

下面是一个例子对Argonaut's lens documentation一个简化版本:如何使用Argonaut镜头修改数字JSON字段?

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}} 

你怎么做了类似的事情数字字段?例如,假设我们想在obj添加1到上面的数字,让

// res1: argonaut.Json = {"a":{"b":"x","c":3}} 

我第一次尝试的结果是尝试

val lens2 = jObjectPL >=> jsonObjectPL("a") >=> 
      jObjectPL >=> jsonObjectPL("c") >=> jNumberPL 

lens2.mod(_ + 1, obj) 

但这最后一行没有编译。

+0

备注:“PL”代表“部分镜头”,因为它们是Scalaz [PLens](http://docs.typelevel.org/api/scalaz/nightly/index.html#scalaz.PLensFamily)实例。 –

回答

1

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

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

JsonNumber亚型公共构造函数为:

  • JsonLong
  • JsonBigDecimal
  • JsonDouble

下面是在问题的最后一行代码的修改后的版本,使用JsonBigDecimal

lens2.mod(i => JsonBigDecimal(i.toBigDecimal + 1), obj) 
相关问题