com.fasterxml.jackson.databind.module.SimpleModule Scala Examples
The following examples show how to use com.fasterxml.jackson.databind.module.SimpleModule.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: CustomJson.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.api.http.json import java.io.IOException import akka.http.scaladsl.model.MediaType import akka.http.scaladsl.model.MediaTypes.`application/json` import com.fasterxml.jackson.core.io.SegmentedStringWriter import com.fasterxml.jackson.core.util.BufferRecyclers import com.fasterxml.jackson.core.{JsonGenerator, JsonProcessingException} import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.{JsonMappingException, JsonSerializer, ObjectMapper, SerializerProvider} import play.api.libs.json._ object NumberAsStringSerializer extends JsonSerializer[JsValue] { private val fieldNamesToTranslate = Set( "amount", "available", "balance", "buyMatcherFee", "currentReward", "desiredReward", "effective", "fee", "feeAmount", "generating", "in", "matcherFee", "minIncrement", "minSponsoredAssetFee", "out", "price", "quantity", "regular", "reward", "sellMatcherFee", "sponsorBalance", "totalAmount", "totalFee", "totalWavesAmount", "value" ) override def serialize(value: JsValue, json: JsonGenerator, provider: SerializerProvider): Unit = { value match { case JsNumber(v) => json.writeNumber(v.bigDecimal) case JsString(v) => json.writeString(v) case JsBoolean(v) => json.writeBoolean(v) case JsArray(elements) => json.writeStartArray() elements.foreach { t => serialize(t, json, provider) } json.writeEndArray() case JsObject(values) => json.writeStartObject() values.foreach { case (name, JsNumber(v)) if fieldNamesToTranslate(name) => json.writeStringField(name, v.bigDecimal.toPlainString) case (name, jsv) => json.writeFieldName(name) serialize(jsv, json, provider) } json.writeEndObject() case JsNull => json.writeNull() } } } object CustomJson { val jsonWithNumbersAsStrings: MediaType.WithFixedCharset = `application/json`.withParams(Map("large-significand-format" -> "string")) private lazy val mapper = (new ObjectMapper) .registerModule(new SimpleModule("WavesJson").addSerializer(classOf[JsValue], NumberAsStringSerializer)) .configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true) def writeValueAsString(value: JsValue): String = { val sw = new SegmentedStringWriter(BufferRecyclers.getBufferRecycler) try mapper.writeValue(sw, value) catch { case e: JsonProcessingException => throw e case e: IOException => // shouldn't really happen, but is declared as possibility so: throw JsonMappingException.fromUnexpectedIOE(e) } sw.getAndClear } }
Example 2
Source File: HttpOrderBook.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.api.http.entities import com.fasterxml.jackson.core.{JsonGenerator, JsonParser} import com.fasterxml.jackson.databind.annotation.JsonSerialize import com.fasterxml.jackson.databind.deser.std.StdDeserializer import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.ser.std.StdSerializer import com.fasterxml.jackson.databind.{DeserializationContext, JsonNode, ObjectMapper, SerializerProvider} import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.model.Denormalization import com.wavesplatform.dex.model.LevelAgg @JsonSerialize(using = classOf[HttpOrderBook.Serializer]) case class HttpOrderBook(timestamp: Long, pair: AssetPair, bids: Seq[LevelAgg], asks: Seq[LevelAgg], assetPairDecimals: Option[(Int, Int)] = None) object HttpOrderBook { private val coreTypeSerializers = new SimpleModule() coreTypeSerializers.addDeserializer(classOf[AssetPair], new AssetPairDeserializer) private val mapper = new ObjectMapper() with ScalaObjectMapper mapper.registerModule(DefaultScalaModule) mapper.registerModule(coreTypeSerializers) private def serialize(value: Any): String = mapper.writeValueAsString(value) private class AssetPairDeserializer extends StdDeserializer[AssetPair](classOf[AssetPair]) { override def deserialize(p: JsonParser, ctxt: DeserializationContext): AssetPair = { val node = p.getCodec.readTree[JsonNode](p) def readAssetId(fieldName: String): Asset = { val x = node.get(fieldName).asText(Asset.WavesName) if (x == Asset.WavesName) Waves else IssuedAsset(ByteStr.decodeBase58(x).get) } AssetPair(readAssetId("amountAsset"), readAssetId("priceAsset")) } } private def formatValue(value: BigDecimal, decimals: Int): String = new java.text.DecimalFormat(s"0.${"0" * decimals}").format(value) private def denormalizeAndSerializeSide(side: Seq[LevelAgg], amountAssetDecimals: Int, priceAssetDecimals: Int, jg: JsonGenerator): Unit = { side.foreach { levelAgg => val denormalizedPrice = Denormalization.denormalizePrice(levelAgg.price, amountAssetDecimals, priceAssetDecimals) val denormalizedAmount = Denormalization.denormalizeAmountAndFee(levelAgg.amount, amountAssetDecimals) jg.writeStartArray(2) jg.writeString(formatValue(denormalizedPrice, priceAssetDecimals)) jg.writeString(formatValue(denormalizedAmount, amountAssetDecimals)) jg.writeEndArray() } } def toJson(x: HttpOrderBook): String = serialize(x) class Serializer extends StdSerializer[HttpOrderBook](classOf[HttpOrderBook]) { override def serialize(x: HttpOrderBook, j: JsonGenerator, serializerProvider: SerializerProvider): Unit = { j.writeStartObject() j.writeNumberField("timestamp", x.timestamp) x.assetPairDecimals.fold { j.writeFieldName("pair") j.writeStartObject() j.writeStringField("amountAsset", x.pair.amountAssetStr) j.writeStringField("priceAsset", x.pair.priceAssetStr) j.writeEndObject() j.writeArrayFieldStart("bids") x.bids.foreach(j.writeObject) j.writeEndArray() j.writeArrayFieldStart("asks") x.asks.foreach(j.writeObject) j.writeEndArray() } { case (amountAssetDecimals, priceAssetDecimals) => j.writeArrayFieldStart("bids") denormalizeAndSerializeSide(x.bids, amountAssetDecimals, priceAssetDecimals, j) j.writeEndArray() j.writeArrayFieldStart("asks") denormalizeAndSerializeSide(x.asks, amountAssetDecimals, priceAssetDecimals, j) j.writeEndArray() } j.writeEndObject() } } }
Example 3
Source File: ThirdPartyOverridesReader.scala From exodus with MIT License | 5 votes |
package com.wixpress.build.bazel import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.databind._ import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.module.scala.DefaultScalaModule object ThirdPartyOverridesReader { def from(json: String): ThirdPartyOverrides = { mapper.readValue(json, classOf[ThirdPartyOverrides]) } def mapper: ObjectMapper = { val objectMapper = new ObjectMapper() .registerModule(DefaultScalaModule) objectMapper.registerModule(overrideCoordinatesKeyModule(objectMapper)) objectMapper } private def overrideCoordinatesKeyModule(mapper: ObjectMapper): Module = new SimpleModule() .addKeyDeserializer(classOf[OverrideCoordinates], new OverrideCoordinatesKeyDeserializer(mapper)) .addKeySerializer(classOf[OverrideCoordinates], new OverrideCoordinatesKeySerializer(mapper)) private class OverrideCoordinatesKeySerializer(mapper: ObjectMapper) extends JsonSerializer[OverrideCoordinates] { override def serialize(value: OverrideCoordinates, gen: JsonGenerator, serializers: SerializerProvider): Unit = gen.writeFieldName(value.groupId + ":" + value.artifactId) } private class OverrideCoordinatesKeyDeserializer(mapper: ObjectMapper) extends KeyDeserializer { override def deserializeKey(key: String, ctxt: DeserializationContext): AnyRef = key.split(':') match { case Array(groupId, artifactId) => OverrideCoordinates(groupId, artifactId) case _ => throw new IllegalArgumentException(s"OverrideCoordinates key should be in form of groupId:artifactId, got $key") } } }
Example 4
Source File: RelativePathSupport.scala From exodus with MIT License | 5 votes |
package com.wix.bazel.migrator.analyze import java.io.IOException import java.nio.file.{Path, Paths} import com.fasterxml.jackson.core.{JsonGenerator, JsonParser, JsonToken} import com.fasterxml.jackson.databind._ import com.fasterxml.jackson.databind.module.SimpleModule class RelativePathSupportingModule extends SimpleModule { addDeserializer(classOf[Path], new RelativePathSupportingDeserializer) addSerializer(classOf[Path], new RelativePathSupportingSerializer) } class RelativePathSupportingSerializer extends JsonSerializer[Path] { @throws[IOException] def serialize(value: Path, gen: JsonGenerator, serializers: SerializerProvider): Unit = value match { case null => gen.writeNull() case _ => gen.writeString(value.toString) } } class RelativePathSupportingDeserializer extends JsonDeserializer[Path] { @throws[IOException] def deserialize(p: JsonParser, ctxt: DeserializationContext): Path = p.getCurrentToken match { case JsonToken.VALUE_NULL => null case JsonToken.VALUE_STRING => Paths.get(p.readValueAs(classOf[String])) case _ => throw ctxt.wrongTokenException(p, JsonToken.VALUE_STRING, "The value of a java.nio.file.Path must be a string") } }
Example 5
Source File: SourceModuleSupport.scala From exodus with MIT License | 5 votes |
package com.wix.bazel.migrator.analyze import java.io.IOException import com.fasterxml.jackson.core.{JsonGenerator, JsonParser, JsonToken} import com.fasterxml.jackson.databind._ import com.fasterxml.jackson.databind.module.SimpleModule import com.wix.bazel.migrator.model.SourceModule class SourceModuleSupportingModule(modules: Set[SourceModule]) extends SimpleModule { addDeserializer(classOf[SourceModule], new SourceModuleSupportingDeserializer(modules)) addSerializer(classOf[SourceModule], new SourceModuleSupportingSerializer) } class SourceModuleSupportingSerializer extends JsonSerializer[SourceModule] { @throws[IOException] def serialize(value: SourceModule, gen: JsonGenerator, serializers: SerializerProvider): Unit = value match { case null => gen.writeNull() case _ => gen.writeString(value.relativePathFromMonoRepoRoot) } } class SourceModuleSupportingDeserializer(modules: Set[SourceModule]) extends JsonDeserializer[SourceModule] { @throws[IOException] def deserialize(p: JsonParser, ctxt: DeserializationContext): SourceModule = p.getCurrentToken match { case JsonToken.VALUE_NULL => null case JsonToken.VALUE_STRING => { val relativePath = p.readValueAs(classOf[String]) modules.find(_.relativePathFromMonoRepoRoot == relativePath) .getOrElse(throw ctxt.weirdStringException(relativePath, classOf[SourceModule], s"could not find module with relative path for $relativePath")) } case token => throw ctxt.wrongTokenException(p, JsonToken.VALUE_STRING, s"The value of a module must be a string and currently is $token") } }
Example 6
Source File: ColumnDateTimeFormats.scala From milan with Apache License 2.0 | 5 votes |
package com.amazon.milan.dataformats import java.time.Instant import java.time.format.DateTimeFormatter import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.{JsonSerializer, SerializerProvider} class ColumnDateTimeFormatsInstantSerializer(dateTimeFormats: Map[String, DateTimeFormatter]) extends JsonSerializer[Instant] { override def serialize(value: Instant, jsonGenerator: JsonGenerator, serializerProvider: SerializerProvider): Unit = { val contextName = jsonGenerator.getOutputContext.getCurrentName val dateTimeFormatter = this.dateTimeFormats.get(contextName) match { case Some(formatter) => formatter case None => DateTimeFormatter.ISO_INSTANT } jsonGenerator.writeString(dateTimeFormatter.format(value)) } }
Example 7
Source File: InstantModule.scala From milan with Apache License 2.0 | 5 votes |
package com.amazon.milan.dataformats import java.time.format.{DateTimeFormatter, DateTimeParseException} import java.time.temporal.{TemporalAccessor, TemporalQuery} import java.time.{Instant, LocalDateTime, ZoneOffset} import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.{DeserializationContext, JsonDeserializer} class InstantModule extends SimpleModule { this.addDeserializer[Instant](classOf[Instant], new MilanInstantDeserializer) } class MilanInstantDeserializer extends JsonDeserializer[Instant] { private val formatsToTry = List( DateTimeFormatter.ISO_INSTANT, DateTimeFormatter.ISO_DATE_TIME, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"), DateTimeFormatter.ISO_DATE) override def deserialize(parser: JsonParser, context: DeserializationContext): Instant = { val textValue = parser.getText this.parseInstant(textValue) } private val createInstant = new TemporalQuery[Instant] { override def queryFrom(temporal: TemporalAccessor): Instant = LocalDateTime.from(temporal).toInstant(ZoneOffset.UTC) } private def parseInstant(dateTimeString: String): Instant = { // Try a bunch of formats. // TODO: This is awful but will do for now. formatsToTry.map(formatter => this.tryParseFormat(dateTimeString, formatter)) .filter(_.isDefined) .map(_.get) .headOption match { case Some(instant) => instant case None => throw new DateTimeParseException(s"Unable to parse datetime string '$dateTimeString'.", dateTimeString, 0) } } private def tryParseFormat(dateTimeString: String, formatter: DateTimeFormatter): Option[Instant] = { try { Some(formatter.parse(dateTimeString, this.createInstant)) } catch { case _: DateTimeParseException => None } } }
Example 8
Source File: SparkDruidIndexerModule.scala From druid-spark-batch with Apache License 2.0 | 5 votes |
package io.druid.indexer.spark import com.fasterxml.jackson.databind.Module import com.fasterxml.jackson.databind.jsontype.NamedType import com.fasterxml.jackson.databind.module.SimpleModule import com.google.inject.Binder import io.druid.initialization.DruidModule import java.util import scala.collection.JavaConverters._ class SparkDruidIndexerModule extends DruidModule { override def getJacksonModules: util.List[_ <: Module] = { List( new SimpleModule("SparkDruidIndexer") .registerSubtypes( new NamedType(classOf[SparkBatchIndexTask], "index_spark") ) ).asJava } override def configure(binder: Binder): Unit = { // NOOP } }
Example 9
Source File: Kind.scala From incubator-livy with Apache License 2.0 | 5 votes |
package org.apache.livy.sessions import com.fasterxml.jackson.core.{JsonGenerator, JsonParser, JsonToken} import com.fasterxml.jackson.databind._ import com.fasterxml.jackson.databind.module.SimpleModule sealed abstract class Kind(val name: String) { override def toString: String = name } object Spark extends Kind("spark") object PySpark extends Kind("pyspark") object SparkR extends Kind("sparkr") object Shared extends Kind("shared") object SQL extends Kind("sql") object Kind { def apply(kind: String): Kind = kind match { case "spark" | "scala" => Spark case "pyspark" | "python" => PySpark case "sparkr" | "r" => SparkR case "shared" => Shared case "sql" => SQL case other => throw new IllegalArgumentException(s"Invalid kind: $other") } } class SessionKindModule extends SimpleModule("SessionKind") { addSerializer(classOf[Kind], new JsonSerializer[Kind]() { override def serialize(value: Kind, jgen: JsonGenerator, provider: SerializerProvider): Unit = { jgen.writeString(value.toString) } }) addDeserializer(classOf[Kind], new JsonDeserializer[Kind]() { override def deserialize(jp: JsonParser, ctxt: DeserializationContext): Kind = { require(jp.getCurrentToken() == JsonToken.VALUE_STRING, "Kind should be a string.") Kind(jp.getText()) } }) }
Example 10
Source File: ArrayOfBytesBenchmark.scala From jsoniter-scala with MIT License | 5 votes |
package com.github.plokhotnyuk.jsoniter_scala.benchmark import java.nio.charset.StandardCharsets.UTF_8 import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.module.scala.ScalaObjectMapper import com.github.plokhotnyuk.jsoniter_scala.benchmark.JacksonSerDesers.createJacksonMapper import org.openjdk.jmh.annotations.{Param, Setup} abstract class ArrayOfBytesBenchmark extends CommonParams { @Param(Array("1", "10", "100", "1000", "10000", "100000", "1000000")) var size: Int = 1000 var obj: Array[Byte] = _ var jsonString: String = _ var jsonBytes: Array[Byte] = _ var preallocatedBuf: Array[Byte] = _ @Setup def setup(): Unit = { obj = (1 to size).map(_.toByte).toArray jsonString = obj.mkString("[", ",", "]") jsonBytes = jsonString.getBytes(UTF_8) preallocatedBuf = new Array[Byte](jsonBytes.length + 100) } }
Example 11
Source File: CometObjectMapper.scala From comet-data-pipeline with Apache License 2.0 | 5 votes |
package com.ebiznext.comet.utils import com.fasterxml.jackson.annotation.JsonIgnoreType import com.fasterxml.jackson.core.JsonFactory import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.{InjectableValues, ObjectMapper} import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper object CometObjectMapper { // https://github.com/FasterXML/jackson-databind/issues/962 @JsonIgnoreType private class MixinsForObjectMapper } class CometObjectMapper( jf: JsonFactory = null, injectables: scala.collection.immutable.Seq[(Class[_], AnyRef)] = Nil ) extends ObjectMapper(jf) with ScalaObjectMapper { this.registerModule(DefaultScalaModule) this.registerModule(CometJacksonModule) this.registerModule( new SimpleModule() .setMixInAnnotation(classOf[ObjectMapper], classOf[CometObjectMapper.MixinsForObjectMapper]) ) if (injectables.nonEmpty) { val iv = new InjectableValues.Std() injectables.foreach { case (klass, value) => iv.addValue(klass, value) } this.setInjectableValues(iv: InjectableValues) } }
Example 12
Source File: JacksonSupport.scala From pulsar4s with Apache License 2.0 | 5 votes |
package com.sksamuel.pulsar4s.jackson import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.ser.std.NumberSerializers import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper} import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper object JacksonSupport { val mapper: ObjectMapper with ScalaObjectMapper = new ObjectMapper with ScalaObjectMapper mapper.registerModule(DefaultScalaModule) mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL) mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false) mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true) mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true) mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true) val module = new SimpleModule module.addSerializer(new NumberSerializers.DoubleSerializer(classOf[Double])) }
Example 13
Source File: CustomJson.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.http import java.io.IOException import akka.http.scaladsl.model.{MediaRange, MediaType} import akka.http.scaladsl.model.MediaTypes.`application/json` import com.fasterxml.jackson.core.io.SegmentedStringWriter import com.fasterxml.jackson.core.util.BufferRecyclers import com.fasterxml.jackson.core.{JsonGenerator, JsonProcessingException} import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.{JsonMappingException, JsonSerializer, ObjectMapper, SerializerProvider} import play.api.libs.json._ object NumberAsStringSerializer extends JsonSerializer[JsValue] { private val fieldNamesToTranslate = Set( "amount", "available", "balance", "buyMatcherFee", "currentReward", "desiredReward", "effective", "fee", "feeAmount", "generating", "in", "matcherFee", "minIncrement", "minSponsoredAssetFee", "out", "price", "quantity", "regular", "reward", "sellMatcherFee", "sponsorBalance", "totalAmount", "totalFee", "totalWavesAmount", "value" ) override def serialize(value: JsValue, json: JsonGenerator, provider: SerializerProvider): Unit = { value match { case JsNumber(v) => json.writeNumber(v.bigDecimal) case JsString(v) => json.writeString(v) case JsBoolean(v) => json.writeBoolean(v) case JsArray(elements) => json.writeStartArray() elements.foreach { t => serialize(t, json, provider) } json.writeEndArray() case JsObject(values) => json.writeStartObject() values.foreach { case (name, JsNumber(v)) if fieldNamesToTranslate(name) => json.writeStringField(name, v.bigDecimal.toPlainString) case (name, jsv) => json.writeFieldName(name) serialize(jsv, json, provider) } json.writeEndObject() case JsNull => json.writeNull() } } } object CustomJson { val jsonWithNumbersAsStrings: MediaType.WithFixedCharset = `application/json`.withParams(Map("large-significand-format" -> "string")) def acceptsNumbersAsStrings(mr: MediaRange): Boolean = mr match { case MediaRange.One(`jsonWithNumbersAsStrings`, _) => true case _ => false } private lazy val mapper = (new ObjectMapper) .registerModule(new SimpleModule("WavesJson").addSerializer(classOf[JsValue], NumberAsStringSerializer)) .configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true) def writeValueAsString(value: JsValue): String = { val sw = new SegmentedStringWriter(BufferRecyclers.getBufferRecycler) try mapper.writeValue(sw, value) catch { case e: JsonProcessingException => throw e case e: IOException => // shouldn't really happen, but is declared as possibility so: throw JsonMappingException.fromUnexpectedIOE(e) } sw.getAndClear } }
Example 14
Source File: CirceJsonModule.scala From circe-jackson with Apache License 2.0 | 5 votes |
package io.circe.jackson import com.fasterxml.jackson.core.Version import com.fasterxml.jackson.databind.{ BeanDescription, DeserializationConfig, JavaType, JsonSerializer, SerializationConfig } import com.fasterxml.jackson.databind.Module.SetupContext import com.fasterxml.jackson.databind.deser.Deserializers import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.ser.Serializers import io.circe.Json final object CirceJsonModule extends SimpleModule("CirceJson", Version.unknownVersion()) { override final def setupModule(context: SetupContext): Unit = { context.addDeserializers( new Deserializers.Base { override final def findBeanDeserializer( javaType: JavaType, config: DeserializationConfig, beanDesc: BeanDescription ) = { val klass = javaType.getRawClass if (classOf[Json].isAssignableFrom(klass) || klass == Json.JNull.getClass) { new CirceJsonDeserializer(config.getTypeFactory, klass) } else null } } ) context.addSerializers( new Serializers.Base { override final def findSerializer( config: SerializationConfig, javaType: JavaType, beanDesc: BeanDescription ) = { val ser: Object = if (classOf[Json].isAssignableFrom(beanDesc.getBeanClass)) { CirceJsonSerializer } else null ser.asInstanceOf[JsonSerializer[Object]] } } ) } }