2015-08-26 51 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) 
相關問題