Как json4s использует DefaultFormats для сериализации и десериализации json? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь понять, как json4s сериализует и десериализует json, в частности, как он использует форматы. Есть ли в Интернете ссылки, показывающие, как json4s использует DefaultFormats для сериализации и десериализации json? Официальный сайт json4s не проливает свет на это.

1 Ответ

0 голосов
/ 19 ноября 2018

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)
}
...