Deserializar un campo que puede ser uno de dos types de datos utilizando Moshi

Estoy recibiendo algo de JSON de un server OrientDB que se ve así:

{ ... "out": ..., "in": ..., ... } 

Ahora estos dos campos pueden ser de dos types: String y mi propio object personalizado (llamémoslo un Record ). Por ejemplo, para una request, podría recibir esto:

 { ... "out": "#17:0", "in": { ... }, ... } 

Por otra, podría get:

 { ... "out": { ... }, "in": "#18:2", ... } 

Y así. Ambos podrían ser String , ambos podrían ser Records , uno podría ser una String y el otro un Record , etcétera, etcétera. Ahora cuando estoy deserializando este tipo de JSON con Moshi , tendré dos parameters para mantener los valores de sus respectivas keys; sin embargo, como estos valores no son un tipo de datos fijo, es más fácil decirlo que hacerlo.

Crear POJO múltiples (o "POKO" s, supongo, porque estoy usando Kotlin) no funcionaría, porque estos objects se pueden encontrar dentro de otros objects JSON y cosas así. Necesitaría un solo object para el cual estos parameters puedan tomar un tipo de datos variable. Entonces, ¿cómo haría eso?

¿Tendría que escribir un adaptador personalizado en Moshi para serializar / deserializar estos valores? Si es así, ¿cómo podría escribir uno que pueda asignar un cierto tipo de datos dependiendo del valor del parámetro? ¿O hay algún tipo de function de class / function / extensión de Kotlin que pueda encontrar / escribir que pueda contener dos types de datos posibles?

Si es relevante, también estoy usando Retrofit 2 + RxJava 2 para realizar mis llamadas HTTP de forma asíncrona, por lo que si hay algún tipo de datos o funciones en estas bibliotecas que faciliten algo así, soy todo oídos.

Incluso si alguien solo puede responder en Java, está bien, porque puedo convertir el código yo mismo. Y si me falta algo obvio, me disculpo de antemano.