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

JsonStringin Argonaut は単に の型エイリアスですStringが、JSON で数値を完全に表現できるコア Scala 型がないため、数値は少し複雑です。

Argonaut の数値型はJsonNumberであるため、 に渡される最初の引数の型は であるmod必要があります(JsonNumber) => JsonNumber

パブリック コンストラクターを持つサブタイプは次のJsonNumberとおりです。

  • JsonLong
  • JsonBigDecimal
  • JsonDouble

を使用して、質問の最後のコード行の修正版を次に示しますJsonBigDecimal

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