[英]How to modify a numeric JSON field using an Argonaut lens?
這是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}}
您如何用數字字段做類似的事情? 例如,假設我們想在上面的obj
的數字上加1
,以得到
// res1: argonaut.Json = {"a":{"b":"x","c":3}}
我的第一次嘗試是嘗試
val lens2 = jObjectPL >=> jsonObjectPL("a") >=>
jObjectPL >=> jsonObjectPL("c") >=> jNumberPL
lens2.mod(_ + 1, obj)
但是最后一行沒有編譯。
Argonaut中的JsonString
只是String
的類型別名,但是數字稍微復雜一些,因為沒有核心Scala類型可以完美地表示JSON中的數字。
Argonaut中的數字類型為JsonNumber
,因此傳遞給mod
的第一個參數的類型需要為(JsonNumber) => JsonNumber
。
具有公共構造函數的JsonNumber
子類型為:
JsonLong
JsonBigDecimal
JsonDouble
這是使用JsonBigDecimal
的問題的最后一行的正確版本:
lens2.mod(i => JsonBigDecimal(i.toBigDecimal + 1), obj)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.