Можно ли переопределить неявный объект, содержащийся в признаке, который расширяется? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть черта-обертка, которая расширяет базовые форматы из спрея json https://github.com/spray/spray-json/blob/release/1.3.x/src/main/scala/spray/json/BasicFormats.scala

, но я бы хотел изменить поведение implicit object BigDecimalJsonFormat extends JsonFormat[BigDecimal], чтобы добавить логики округления c , Примером является

import spray.json._
import scala.math.BigDecimal.RoundingMode

case class Foo(i: BigDecimal)
object Foo extends DefaultJsonProtocol {
  implicit val roundedBigDecimalProtocol: JsonFormat[BigDecimal] =
    new JsonFormat[BigDecimal] {

      def write(f: BigDecimal) = JsNumber(f.setScale(2, RoundingMode.HALF_UP))

      def read(json: JsValue): BigDecimal =
        DefaultJsonProtocol.BigDecimalJsonFormat.read(json)
    }
  implicit val fooFormatter = jsonFormat1(this.apply)
}

scast ie фрагмент: https://scastie.scala-lang.org/9RNhajzGRDGMX5QsuAohVA

1 Ответ

0 голосов
/ 27 марта 2020

Отличный вопрос, я даже не подозревал, что это может вызвать столько проблем. Решение, которое я собираюсь предложить, вероятно, не самое чистое, но оно выполняет свою работу ... Прежде всего, вам не нужно расширять DefaultJsonProtocol, вы также можете импортировать его члены:

object Foo {
  import DefaultJsonProtocol._

  implicit val roundedBigDecimalProtocol: JsonFormat[BigDecimal] = ...
  implicit val fooFormatter = jsonFormat1(this.apply)
}

Это не решает проблему, но таким образом вы можете исключить некоторые элементы, чтобы они не были импортированы. Вот синтаксис для этого

import DefaultJsonProtocol.{BigDecimalJsonFormat => _, _}

Он в основном говорит: не импортируйте BigDecimalJsonFormat, а импортируйте остальное.

И следующий код суммирует это.

import spray.json._
import scala.math.BigDecimal.RoundingMode

case class Foo(i: BigDecimal)
object Foo {
  import DefaultJsonProtocol.{BigDecimalJsonFormat => _, _}

  implicit val roundedBigDecimalProtocol: JsonFormat[BigDecimal] =
    new JsonFormat[BigDecimal] {

      def write(f: BigDecimal) = JsNumber(f.setScale(2, RoundingMode.HALF_UP))

      def read(json: JsValue): BigDecimal =
        DefaultJsonProtocol.BigDecimalJsonFormat.read(json)
    }
  implicit val fooFormatter = jsonFormat1(this.apply)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...