簡體   English   中英

如何使用Argonaut鏡頭修改數字JSON字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM