DefaultFormats
является предоставленной реализацией черты Formats
.
Вы можете увидеть, как она используется в методах Extraction.decompose
и Extraction.extract
(json4s использует эти методы для сериализации / десериализации).
Extraction.extract
использует Extraction.convert
:
private[this] def convert(key: String, target: ScalaType, formats: Formats): Any = {
val targetType = target.erasure
targetType match {
case tt if tt == classOf[String] => key
case tt if tt == classOf[Symbol] => Symbol(key)
case tt if tt == classOf[Int] => key.toInt
case tt if tt == classOf[JavaInteger] => JavaInteger.valueOf(key.toInt)
case tt if tt == classOf[BigInt] => key.toInt
case tt if tt == classOf[Long] => key.toLong
case tt if tt == classOf[JavaLong] => JavaLong.valueOf(key.toLong)
case tt if tt == classOf[Short] => key.toShort
case tt if tt == classOf[JavaShort] => JavaShort.valueOf(key.toShort)
case tt if tt == classOf[Date] => formatDate(key, formats)
case tt if tt == classOf[Timestamp] => formatTimestamp(key, formats)
case _ =>
val deserializer = formats.customKeyDeserializer(formats)
val typeInfo = TypeInfo(targetType, None)
if(deserializer.isDefinedAt((typeInfo, key))) {
deserializer((typeInfo, key))
} else {
fail("Do not know how to deserialize key of type " + targetType + ". Consider implementing a CustomKeyDeserializer.")
}
}
}
Итак, json4s пытается найти в Formats
пользовательский десериализатор для всех неизвестных типов.
Extraction.decompose
используетExtraction.decomposeObject
под капотом, где json4s пытается сериализовать все типы с помощью специального сериализатора:
if (formats.customSerializer(formats).isDefinedAt(a)) {
current addJValue formats.customSerializer(formats)(a)
}